[jajuk] 01/01: add patch from jajuk develop branch to rewplace scrollablepopupmenu/* and JScrollingText.java
Felix Natter
fnatter-guest at moszumanska.debian.org
Sat Apr 9 12:43:16 UTC 2016
This is an automated email from the git hooks/post-receive script.
fnatter-guest pushed a commit to branch master
in repository jajuk.
commit 3d14ec967e02b7c43fb7314a961a2b974ee4a61d
Author: Felix Natter <fnatter at gmx.net>
Date: Sat Apr 9 14:43:02 2016 +0200
add patch from jajuk develop branch to rewplace scrollablepopupmenu/* and JScrollingText.java
---
debian/patches/06_scrolling_stuff.patch | 997 ++++++++++++++++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 998 insertions(+)
diff --git a/debian/patches/06_scrolling_stuff.patch b/debian/patches/06_scrolling_stuff.patch
new file mode 100644
index 0000000..5b649a6
--- /dev/null
+++ b/debian/patches/06_scrolling_stuff.patch
@@ -0,0 +1,997 @@
+Description: Rewrite code with unclear license in 1.10.9
+ (src/main/java/ext/scrollablepopupmenu/*,
+ src/main/java/ext/JScrollingText.java)
+Author: Bertrand Florat <bertrand at florat.net>
+Origin: upstream
+Forwarded: not-needed
+Applied-Upstream: commit, https://github.com/jajuk-team/jajuk/commit/76cb3ab196f9e4a8cb6962cbfbf827c312a42abb#diff-45157af1fa71b3dc9df4ee3daa6682c2
+Last-Update: 2016-04-09
+--- /dev/null
++++ b/src/main/java/ext/MenuScroller.java
+@@ -0,0 +1,704 @@
++/*
++ * Licensed to the Apache Software Foundation (ASF) under one or more
++ * contributor license agreements. See the NOTICE file distributed with
++ * this work for additional information regarding copyright ownership.
++ * The ASF licenses this file to You under the Apache License, Version 2.0
++ * (the "License"); you may not use this file except in compliance with
++ * the License. You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ *
++ */
++
++package ext;
++
++import java.awt.Color;
++import java.awt.Component;
++import java.awt.Dimension;
++import java.awt.Graphics;
++import java.awt.event.ActionEvent;
++import java.awt.event.ActionListener;
++import java.awt.event.MouseWheelEvent;
++import java.awt.event.MouseWheelListener;
++
++import javax.swing.Icon;
++import javax.swing.JComponent;
++import javax.swing.JMenu;
++import javax.swing.JMenuItem;
++import javax.swing.JPopupMenu;
++import javax.swing.MenuSelectionManager;
++import javax.swing.Timer;
++import javax.swing.event.ChangeEvent;
++import javax.swing.event.ChangeListener;
++import javax.swing.event.PopupMenuEvent;
++import javax.swing.event.PopupMenuListener;
++
++/**
++ * A class that provides scrolling capabilities to a long menu dropdown or popup
++ * menu. A number of items can optionally be frozen at the top and/or bottom of
++ * the menu.
++ * <P>
++ * <B>Implementation note:</B> The default number of items to display at a time
++ * is 15, and the default scrolling interval is 125 milliseconds.
++ * <P>
++ *
++ * Class is slightly changed as per comments on the webpage
++ * @version 1.5.0 04/05/12
++ * @author Darryl Burke (http://tips4java.wordpress.com/2009/02/01/menu-scroller/)
++ *
++ * Adapted by Jajuk team
++ */
++public class MenuScroller {
++
++ // private JMenu menu;
++ private JPopupMenu menu;
++ private Component[] menuItems;
++ private MenuScrollItem upItem;
++ private MenuScrollItem downItem;
++ private final MenuScrollListener menuListener = new MenuScrollListener();
++ private final MouseWheelListener mouseWheelListener = new MouseScrollListener();
++ private int scrollCount;
++ private int interval;
++ private int topFixedCount;
++ private int bottomFixedCount;
++ private int firstIndex = 0;
++ private int keepVisibleIndex = -1;
++
++ /**
++ * Registers a menu to be scrolled with the default number of items to
++ * display at a time and the default scrolling interval.
++ *
++ * @param menu
++ * the menu
++ * @return the MenuScroller
++ */
++ public static MenuScroller setScrollerFor(JMenu menu) {
++ return new MenuScroller(menu);
++ }
++
++ /**
++ * Registers a popup menu to be scrolled with the default number of items to
++ * display at a time and the default scrolling interval.
++ *
++ * @param menu
++ * the popup menu
++ * @return the MenuScroller
++ */
++ public static MenuScroller setScrollerFor(JPopupMenu menu) {
++ return new MenuScroller(menu);
++ }
++
++ /**
++ * Registers a menu to be scrolled with the default number of items to
++ * display at a time and the specified scrolling interval.
++ *
++ * @param menu
++ * the menu
++ * @param scrollCount
++ * the number of items to display at a time
++ * @return the MenuScroller
++ * @throws IllegalArgumentException
++ * if scrollCount is 0 or negative
++ */
++ public static MenuScroller setScrollerFor(JMenu menu, int scrollCount) {
++ return new MenuScroller(menu, scrollCount);
++ }
++
++ /**
++ * Registers a popup menu to be scrolled with the default number of items to
++ * display at a time and the specified scrolling interval.
++ *
++ * @param menu
++ * the popup menu
++ * @param scrollCount
++ * the number of items to display at a time
++ * @return the MenuScroller
++ * @throws IllegalArgumentException
++ * if scrollCount is 0 or negative
++ */
++ public static MenuScroller setScrollerFor(JPopupMenu menu, int scrollCount) {
++ return new MenuScroller(menu, scrollCount);
++ }
++
++ /**
++ * Registers a menu to be scrolled, with the specified number of items to
++ * display at a time and the specified scrolling interval.
++ *
++ * @param menu
++ * the menu
++ * @param scrollCount
++ * the number of items to be displayed at a time
++ * @param interval
++ * the scroll interval, in milliseconds
++ * @return the MenuScroller
++ * @throws IllegalArgumentException
++ * if scrollCount or interval is 0 or negative
++ */
++ public static MenuScroller setScrollerFor(JMenu menu, int scrollCount,
++ int interval) {
++ return new MenuScroller(menu, scrollCount, interval);
++ }
++
++ /**
++ * Registers a popup menu to be scrolled, with the specified number of items
++ * to display at a time and the specified scrolling interval.
++ *
++ * @param menu
++ * the popup menu
++ * @param scrollCount
++ * the number of items to be displayed at a time
++ * @param interval
++ * the scroll interval, in milliseconds
++ * @return the MenuScroller
++ * @throws IllegalArgumentException
++ * if scrollCount or interval is 0 or negative
++ */
++ public static MenuScroller setScrollerFor(JPopupMenu menu, int scrollCount,
++ int interval) {
++ return new MenuScroller(menu, scrollCount, interval);
++ }
++
++ /**
++ * Registers a menu to be scrolled, with the specified number of items to
++ * display in the scrolling region, the specified scrolling interval, and
++ * the specified numbers of items fixed at the top and bottom of the menu.
++ *
++ * @param menu
++ * the menu
++ * @param scrollCount
++ * the number of items to display in the scrolling portion
++ * @param interval
++ * the scroll interval, in milliseconds
++ * @param topFixedCount
++ * the number of items to fix at the top. May be 0.
++ * @param bottomFixedCount
++ * the number of items to fix at the bottom. May be 0
++ * @throws IllegalArgumentException
++ * if scrollCount or interval is 0 or negative or if
++ * topFixedCount or bottomFixedCount is negative
++ * @return the MenuScroller
++ */
++ public static MenuScroller setScrollerFor(JMenu menu, int scrollCount,
++ int interval, int topFixedCount, int bottomFixedCount) {
++ return new MenuScroller(menu, scrollCount, interval, topFixedCount,
++ bottomFixedCount);
++ }
++
++ /**
++ * Registers a popup menu to be scrolled, with the specified number of items
++ * to display in the scrolling region, the specified scrolling interval, and
++ * the specified numbers of items fixed at the top and bottom of the popup
++ * menu.
++ *
++ * @param menu
++ * the popup menu
++ * @param scrollCount
++ * the number of items to display in the scrolling portion
++ * @param interval
++ * the scroll interval, in milliseconds
++ * @param topFixedCount
++ * the number of items to fix at the top. May be 0
++ * @param bottomFixedCount
++ * the number of items to fix at the bottom. May be 0
++ * @throws IllegalArgumentException
++ * if scrollCount or interval is 0 or negative or if
++ * topFixedCount or bottomFixedCount is negative
++ * @return the MenuScroller
++ */
++ public static MenuScroller setScrollerFor(JPopupMenu menu, int scrollCount,
++ int interval, int topFixedCount, int bottomFixedCount) {
++ return new MenuScroller(menu, scrollCount, interval, topFixedCount,
++ bottomFixedCount);
++ }
++
++ /**
++ * Constructs a <code>MenuScroller</code> that scrolls a menu with the
++ * default number of items to display at a time, and default scrolling
++ * interval.
++ *
++ * @param menu
++ * the menu
++ */
++ public MenuScroller(JMenu menu) {
++ this(menu, 15);
++ }
++
++ /**
++ * Constructs a <code>MenuScroller</code> that scrolls a popup menu with the
++ * default number of items to display at a time, and default scrolling
++ * interval.
++ *
++ * @param menu
++ * the popup menu
++ */
++ public MenuScroller(JPopupMenu menu) {
++ this(menu, 15);
++ }
++
++ /**
++ * Constructs a <code>MenuScroller</code> that scrolls a menu with the
++ * specified number of items to display at a time, and default scrolling
++ * interval.
++ *
++ * @param menu
++ * the menu
++ * @param scrollCount
++ * the number of items to display at a time
++ * @throws IllegalArgumentException
++ * if scrollCount is 0 or negative
++ */
++ public MenuScroller(JMenu menu, int scrollCount) {
++ this(menu, scrollCount, 150);
++ }
++
++ /**
++ * Constructs a <code>MenuScroller</code> that scrolls a popup menu with the
++ * specified number of items to display at a time, and default scrolling
++ * interval.
++ *
++ * @param menu
++ * the popup menu
++ * @param scrollCount
++ * the number of items to display at a time
++ * @throws IllegalArgumentException
++ * if scrollCount is 0 or negative
++ */
++ public MenuScroller(JPopupMenu menu, int scrollCount) {
++ this(menu, scrollCount, 150);
++ }
++
++ /**
++ * Constructs a <code>MenuScroller</code> that scrolls a menu with the
++ * specified number of items to display at a time, and specified scrolling
++ * interval.
++ *
++ * @param menu
++ * the menu
++ * @param scrollCount
++ * the number of items to display at a time
++ * @param interval
++ * the scroll interval, in milliseconds
++ * @throws IllegalArgumentException
++ * if scrollCount or interval is 0 or negative
++ */
++ public MenuScroller(JMenu menu, int scrollCount, int interval) {
++ this(menu, scrollCount, interval, 0, 0);
++ }
++
++ /**
++ * Constructs a <code>MenuScroller</code> that scrolls a popup menu with the
++ * specified number of items to display at a time, and specified scrolling
++ * interval.
++ *
++ * @param menu
++ * the popup menu
++ * @param scrollCount
++ * the number of items to display at a time
++ * @param interval
++ * the scroll interval, in milliseconds
++ * @throws IllegalArgumentException
++ * if scrollCount or interval is 0 or negative
++ */
++ public MenuScroller(JPopupMenu menu, int scrollCount, int interval) {
++ this(menu, scrollCount, interval, 0, 0);
++ }
++
++ /**
++ * Constructs a <code>MenuScroller</code> that scrolls a menu with the
++ * specified number of items to display in the scrolling region, the
++ * specified scrolling interval, and the specified numbers of items fixed at
++ * the top and bottom of the menu.
++ *
++ * @param menu
++ * the menu
++ * @param scrollCount
++ * the number of items to display in the scrolling portion
++ * @param interval
++ * the scroll interval, in milliseconds
++ * @param topFixedCount
++ * the number of items to fix at the top. May be 0
++ * @param bottomFixedCount
++ * the number of items to fix at the bottom. May be 0
++ * @throws IllegalArgumentException
++ * if scrollCount or interval is 0 or negative or if
++ * topFixedCount or bottomFixedCount is negative
++ */
++ public MenuScroller(JMenu menu, int scrollCount, int interval,
++ int topFixedCount, int bottomFixedCount) {
++ this(menu.getPopupMenu(), scrollCount, interval, topFixedCount,
++ bottomFixedCount);
++ }
++
++ /**
++ * Constructs a <code>MenuScroller</code> that scrolls a popup menu with the
++ * specified number of items to display in the scrolling region, the
++ * specified scrolling interval, and the specified numbers of items fixed at
++ * the top and bottom of the popup menu.
++ *
++ * @param menu
++ * the popup menu
++ * @param scrollCount
++ * the number of items to display in the scrolling portion
++ * @param interval
++ * the scroll interval, in milliseconds
++ * @param topFixedCount
++ * the number of items to fix at the top. May be 0
++ * @param bottomFixedCount
++ * the number of items to fix at the bottom. May be 0
++ * @throws IllegalArgumentException
++ * if scrollCount or interval is 0 or negative or if
++ * topFixedCount or bottomFixedCount is negative
++ */
++ public MenuScroller(JPopupMenu menu, int scrollCount, int interval,
++ int topFixedCount, int bottomFixedCount) {
++ if (scrollCount <= 0 || interval <= 0) {
++ throw new IllegalArgumentException(
++ "scrollCount and interval must be greater than 0");
++ }
++ if (topFixedCount < 0 || bottomFixedCount < 0) {
++ throw new IllegalArgumentException(
++ "topFixedCount and bottomFixedCount cannot be negative");
++ }
++
++ upItem = new MenuScrollItem(MenuIcon.UP, -1);
++ downItem = new MenuScrollItem(MenuIcon.DOWN, +1);
++ setScrollCount(scrollCount);
++ setInterval(interval);
++ setTopFixedCount(topFixedCount);
++ setBottomFixedCount(bottomFixedCount);
++
++ this.menu = menu;
++ menu.addPopupMenuListener(menuListener);
++ menu.addMouseWheelListener(mouseWheelListener);
++ }
++
++ /**
++ * Returns the scroll interval in milliseconds
++ *
++ * @return the scroll interval in milliseconds
++ */
++ public int getInterval() {
++ return interval;
++ }
++
++ /**
++ * Sets the scroll interval in milliseconds
++ *
++ * @param interval
++ * the scroll interval in milliseconds
++ * @throws IllegalArgumentException
++ * if interval is 0 or negative
++ */
++ public void setInterval(int interval) {
++ if (interval <= 0) {
++ throw new IllegalArgumentException(
++ "interval must be greater than 0");
++ }
++ upItem.setInterval(interval);
++ downItem.setInterval(interval);
++ this.interval = interval;
++ }
++
++ /**
++ * Returns the number of items in the scrolling portion of the menu.
++ *
++ * @return the number of items to display at a time
++ */
++ public int getscrollCount() {
++ return scrollCount;
++ }
++
++ /**
++ * Sets the number of items in the scrolling portion of the menu.
++ *
++ * @param scrollCount
++ * the number of items to display at a time
++ * @throws IllegalArgumentException
++ * if scrollCount is 0 or negative
++ */
++ public void setScrollCount(int scrollCount) {
++ if (scrollCount <= 0) {
++ throw new IllegalArgumentException(
++ "scrollCount must be greater than 0");
++ }
++ this.scrollCount = scrollCount;
++ MenuSelectionManager.defaultManager().clearSelectedPath();
++ }
++
++ /**
++ * Returns the number of items fixed at the top of the menu or popup menu.
++ *
++ * @return the number of items
++ */
++ public int getTopFixedCount() {
++ return topFixedCount;
++ }
++
++ /**
++ * Sets the number of items to fix at the top of the menu or popup menu.
++ *
++ * @param topFixedCount
++ * the number of items
++ */
++ public void setTopFixedCount(int topFixedCount) {
++ if (firstIndex <= topFixedCount) {
++ firstIndex = topFixedCount;
++ } else {
++ firstIndex += (topFixedCount - this.topFixedCount);
++ }
++ this.topFixedCount = topFixedCount;
++ }
++
++ /**
++ * Returns the number of items fixed at the bottom of the menu or popup
++ * menu.
++ *
++ * @return the number of items
++ */
++ public int getBottomFixedCount() {
++ return bottomFixedCount;
++ }
++
++ /**
++ * Sets the number of items to fix at the bottom of the menu or popup menu.
++ *
++ * @param bottomFixedCount
++ * the number of items
++ */
++ public void setBottomFixedCount(int bottomFixedCount) {
++ this.bottomFixedCount = bottomFixedCount;
++ }
++
++ /**
++ * Scrolls the specified item into view each time the menu is opened. Call
++ * this method with <code>null</code> to restore the default behavior, which
++ * is to show the menu as it last appeared.
++ *
++ * @param item
++ * the item to keep visible
++ * @see #keepVisible(int)
++ */
++ public void keepVisible(JMenuItem item) {
++ if (item == null) {
++ keepVisibleIndex = -1;
++ } else {
++ int index = menu.getComponentIndex(item);
++ keepVisibleIndex = index;
++ }
++ }
++
++ /**
++ * Scrolls the item at the specified index into view each time the menu is
++ * opened. Call this method with <code>-1</code> to restore the default
++ * behavior, which is to show the menu as it last appeared.
++ *
++ * @param index
++ * the index of the item to keep visible
++ * @see #keepVisible(javax.swing.JMenuItem)
++ */
++ public void keepVisible(int index) {
++ keepVisibleIndex = index;
++ }
++
++ /**
++ * Removes this MenuScroller from the associated menu and restores the
++ * default behavior of the menu.
++ */
++ public void dispose() {
++ if (menu != null) {
++ menu.removePopupMenuListener(menuListener);
++ menu.removeMouseWheelListener(mouseWheelListener);
++ menu = null;
++ }
++ }
++
++ /**
++ * Ensures that the <code>dispose</code> method of this MenuScroller is
++ * called when there are no more refrences to it.
++ *
++ * @exception Throwable
++ * if an error occurs.
++ * @see MenuScroller#dispose()
++ */
++ @Override
++ public void finalize() throws Throwable {
++ dispose();
++ }
++
++ private void refreshMenu() {
++ if (menuItems != null && menuItems.length > 0) {
++ firstIndex = Math.max(topFixedCount, firstIndex);
++ firstIndex = Math.min(menuItems.length - bottomFixedCount
++ - scrollCount, firstIndex);
++
++ upItem.setEnabled(firstIndex > topFixedCount);
++ downItem.setEnabled(firstIndex + scrollCount < menuItems.length
++ - bottomFixedCount);
++
++ menu.removeAll();
++ for (int i = 0; i < topFixedCount; i++) {
++ menu.add(menuItems[i]);
++ }
++ if (topFixedCount > 0) {
++ menu.addSeparator();
++ }
++
++ menu.add(upItem);
++ for (int i = firstIndex; i < scrollCount + firstIndex; i++) {
++ menu.add(menuItems[i]);
++ }
++ menu.add(downItem);
++
++ if (bottomFixedCount > 0) {
++ menu.addSeparator();
++ }
++ for (int i = menuItems.length - bottomFixedCount; i < menuItems.length; i++) {
++ menu.add(menuItems[i]);
++ }
++
++ int preferredWidth = 0;
++ for (Component item : menuItems) {
++ preferredWidth = Math.max(preferredWidth, item.getPreferredSize().width);
++ }
++ menu.setPreferredSize(new Dimension(preferredWidth, menu.getPreferredSize().height));
++ JComponent parent = (JComponent) upItem.getParent();
++ parent.revalidate();
++ parent.repaint();
++ }
++ }
++
++ private class MouseScrollListener implements MouseWheelListener {
++ @Override
++ public void mouseWheelMoved(MouseWheelEvent mwe){
++ // Jajuk change : Accelerate the move with x3 factor
++ firstIndex += mwe.getWheelRotation() * 3;
++ refreshMenu();
++ mwe.consume(); // (Comment 16, Huw)
++ }
++ }
++
++ private class MenuScrollListener implements PopupMenuListener {
++
++ @Override
++ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
++ setMenuItems();
++ }
++
++ @Override
++ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
++ restoreMenuItems();
++ }
++
++ @Override
++ public void popupMenuCanceled(PopupMenuEvent e) {
++ restoreMenuItems();
++ }
++
++ private void setMenuItems() {
++ menuItems = menu.getComponents();
++ if (keepVisibleIndex >= topFixedCount
++ && keepVisibleIndex <= menuItems.length - bottomFixedCount
++ && (keepVisibleIndex > firstIndex + scrollCount || keepVisibleIndex < firstIndex)) {
++ firstIndex = Math.min(firstIndex, keepVisibleIndex);
++ firstIndex = Math.max(firstIndex, keepVisibleIndex
++ - scrollCount + 1);
++ }
++ if (menuItems.length > topFixedCount + scrollCount
++ + bottomFixedCount) {
++ refreshMenu();
++ }
++ }
++
++ private void restoreMenuItems() {
++ menu.removeAll();
++ for (Component component : menuItems) {
++ menu.add(component);
++ }
++ }
++ }
++
++ private class MenuScrollTimer extends Timer {
++
++ private static final long serialVersionUID = 1;
++
++ public MenuScrollTimer(final int increment, int interval) {
++ super(interval, new ActionListener() {
++
++ @Override
++ public void actionPerformed(ActionEvent e) {
++ firstIndex += increment;
++ refreshMenu();
++ }
++ });
++ }
++ }
++
++ private class MenuScrollItem extends JMenuItem implements ChangeListener {
++
++ private static final long serialVersionUID = 1;
++
++ private MenuScrollTimer timer;
++
++ public MenuScrollItem(MenuIcon icon, int increment) {
++ setIcon(icon);
++ setDisabledIcon(icon);
++ timer = new MenuScrollTimer(increment, interval);
++ addChangeListener(this);
++ }
++
++ public void setInterval(int interval) {
++ timer.setDelay(interval);
++ }
++
++ @Override
++ public void stateChanged(ChangeEvent e) {
++ if (isArmed() && !timer.isRunning()) {
++ timer.start();
++ }
++ if (!isArmed() && timer.isRunning()) {
++ timer.stop();
++ }
++ }
++ }
++
++ private enum MenuIcon implements Icon {
++
++ UP(9, 1, 9), DOWN(1, 9, 1);
++ final int[] xPoints = { 1, 5, 9 };
++ final int[] yPoints;
++
++ MenuIcon(int... yPoints) {
++ this.yPoints = yPoints;
++ }
++
++ @Override
++ public void paintIcon(Component c, Graphics g, int x, int y) {
++ Dimension size = c.getSize();
++ Graphics g2 = g.create(size.width / 2 - 5, size.height / 2 - 5, 10,
++ 10);
++ g2.setColor(Color.GRAY);
++ g2.drawPolygon(xPoints, yPoints, 3);
++ if (c.isEnabled()) {
++ g2.setColor(Color.BLACK);
++ g2.fillPolygon(xPoints, yPoints, 3);
++ }
++ g2.dispose();
++ }
++
++ @Override
++ public int getIconWidth() {
++ return 0;
++ }
++
++ @Override
++ public int getIconHeight() {
++ return 10;
++ }
++ }
++}
+--- /dev/null
++++ b/src/main/java/org/jajuk/ui/widgets/ScrollingLabel.java
+@@ -0,0 +1,68 @@
++/*
++ * Jajuk
++ * Copyright (C) The Jajuk Team
++ * http://jajuk.info
++ *
++ * 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 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.
++ *
++ */
++
++package org.jajuk.ui.widgets;
++
++import javax.swing.*;
++import java.awt.*;
++import java.util.concurrent.ScheduledThreadPoolExecutor;
++import java.util.concurrent.TimeUnit;
++
++/**
++ * Label that scrolls text horizontally
++ */
++public class ScrollingLabel extends JLabel {
++ private static final long serialVersionUID = 1L;
++ private int posHoriz = 250;
++
++ ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
++
++ public ScrollingLabel(String text) {
++ super(text);
++ }
++
++ public void startScrolling() {
++ executor.scheduleAtFixedRate(new Runnable() {
++ @Override
++ public void run() {
++ repaint();
++ }
++ }, 100, 100, TimeUnit.MILLISECONDS);
++ }
++
++
++ /* (non-Javadoc)
++ * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
++ */
++ @Override
++ public void paintComponent(Graphics g) {
++ FontMetrics fm = g.getFontMetrics();
++ posHoriz = (posHoriz - 10) % getWidth();
++ int textSize = fm.stringWidth(super.getText());
++ if (posHoriz <= -1 * textSize) {
++ posHoriz = getWidth();
++ }
++ //Draw the text on the left
++ g.drawString(getText(), posHoriz, fm.getHeight());
++ // Draw the text on the right
++ g.drawString(getText(), posHoriz + textSize, fm.getHeight());
++ }
++}
+--- a/src/main/java/ext/JSplash.java
++++ b/src/main/java/ext/JSplash.java
+@@ -44,6 +44,7 @@
+
+ import org.jajuk.ui.helpers.FontManager;
+ import org.jajuk.ui.helpers.FontManager.JajukFont;
++import org.jajuk.ui.widgets.ScrollingLabel;
+ import org.jajuk.util.Messages;
+ import org.jajuk.util.UtilSystem;
+
+@@ -130,13 +131,13 @@
+ totd = totd.substring(0, totd.indexOf("<a"));
+ }
+ totd += " ";
+- JScrollingText scrollingText = new JScrollingText(totd, -5);
++ ScrollingLabel scrollingText = new ScrollingLabel(totd);
+ scrollingText.setPreferredSize(new Dimension(400, 20));
+ scrollingText.setMaximumSize(new Dimension(400, 20));
+ GridLayout layout = new GridLayout(2, 1, 0, 0);
+ JPanel jpTotdAndProgress = new JPanel(layout);
+ jpTotdAndProgress.setBorder(new EmptyBorder(4, 5, 0, 5));
+- scrollingText.start();
++ scrollingText.startScrolling();
+ if (mProgressBar) {
+ mProgress = new JProgressBar();
+ if (mProgressBarMessages || mProgressBarPercent) {
+--- a/src/main/java/org/jajuk/ui/widgets/WebRadioButton.java
++++ b/src/main/java/org/jajuk/ui/widgets/WebRadioButton.java
+@@ -21,104 +21,100 @@
+ package org.jajuk.ui.widgets;
+
+ import ext.DropDownButton;
+-import ext.scrollablepopupmenu.XCheckedButton;
+-import ext.scrollablepopupmenu.XJPopupMenu;
+-
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-
+-import javax.swing.ImageIcon;
+-import javax.swing.JPopupMenu;
+-
++import ext.MenuScroller;
+ import org.jajuk.services.webradio.WebRadio;
+ import org.jajuk.services.webradio.WebRadioHelper;
+ import org.jajuk.services.webradio.WebRadioManager;
+ import org.jajuk.ui.actions.ActionManager;
+ import org.jajuk.ui.actions.JajukAction;
+ import org.jajuk.ui.actions.JajukActions;
+-import org.jajuk.ui.windows.JajukMainWindow;
+ import org.jajuk.util.Conf;
+ import org.jajuk.util.Const;
+ import org.jajuk.util.Messages;
+ import org.jajuk.util.UtilString;
+ import org.jajuk.util.log.Log;
+
++import javax.swing.*;
++import java.awt.event.ActionEvent;
++import java.awt.event.ActionListener;
++
+ /**
+ * Factorizes code dealing with Web Radio button shared by command panel and slimbar.
+ */
+ public class WebRadioButton extends DropDownButton {
+- /** Associated popup. */
+- private XJPopupMenu popupWebRadio;
+- /** Generated serialVersionUID. */
+- private static final long serialVersionUID = 1L;
+-
+- /**
+- * Instantiates a new web radio button.
+- * @param icon : button icon
+- */
+- public WebRadioButton(ImageIcon icon) {
+- super(icon);
+- setText("");
+- popupWebRadio = new XJPopupMenu(JajukMainWindow.getInstance());
+- setAction(ActionManager.getAction(JajukActions.WEB_RADIO));
+- // Force 16x16 icon
+- setIcon(icon);
+- populateWebRadios();
+- }
+-
+- /* (non-Javadoc)
+- * @see ext.DropDownButton#getPopupMenu()
+- */
+- @Override
+- protected JPopupMenu getPopupMenu() {
+- // Force populating the radios each time the drop down button is pressed to make sure the
+- // current radio icon is synchronized between slimar and main window, see #1866
+- populateWebRadios();
+- return popupWebRadio;
+- }
+-
+- /**
+- * Populate webradios.
+- */
+- public void populateWebRadios() {
+- try {
+- // Update button tooltip
+- setToolTipText(WebRadioHelper.getCurrentWebRadioTooltip());
+- // Clear previous elements
+- popupWebRadio.removeAll();
+- for (final WebRadio radio : WebRadioManager.getInstance().getWebRadios()) {
+- String label = radio.getName();
+- if (UtilString.isNotEmpty(radio.getGenre())) {
+- label += " [" + radio.getGenre() + "]";
+- }
+- XCheckedButton jmi = new XCheckedButton(label);
+- jmi.addActionListener(new ActionListener() {
+- @Override
+- public void actionPerformed(ActionEvent e) {
+- Conf.setProperty(Const.CONF_DEFAULT_WEB_RADIO, radio.getName());
+- // force to reselect the item
+- populateWebRadios();
+- // update action tooltip on main button with right item
+- JajukAction action = ActionManager.getAction(JajukActions.WEB_RADIO);
+- action.setShortDescription(Const.HTML + Messages.getString("CommandJPanel.25")
+- + Const.P_B + radio.getName() + Const.B_P_HTML);
+- // Actually launch the webradio
+- try {
+- action.perform(null);
+- } catch (Exception e1) {
+- Log.error(e1);
++ /**
++ * Associated popup menu.
++ */
++ private JPopupMenu webradios;
++ /**
++ * Generated serialVersionUID.
++ */
++ private static final long serialVersionUID = 1L;
++
++ /**
++ * Instantiates a new web radio button.
++ *
++ * @param icon : button icon
++ */
++ public WebRadioButton(ImageIcon icon) {
++ super(icon);
++ setText("");
++ webradios = new JPopupMenu();
++ MenuScroller.setScrollerFor(webradios, 30, 100);
++ setAction(ActionManager.getAction(JajukActions.WEB_RADIO));
++ // Force 16x16 icon
++ setIcon(icon);
++ populateWebRadios();
++ }
++
++ /* (non-Javadoc)
++ * @see ext.DropDownButton#getPopupMenu()
++ */
++ @Override
++ protected JPopupMenu getPopupMenu() {
++ // Force populating the radios each time the drop down button is pressed to make sure the
++ // current radio icon is synchronized between slimar and main window, see #1866
++ populateWebRadios();
++ return webradios;
++ }
++
++ /**
++ * Populate webradios.
++ */
++ public void populateWebRadios() {
++ try {
++ // Update button tooltip
++ setToolTipText(WebRadioHelper.getCurrentWebRadioTooltip());
++ // Clear previous elements
++ webradios.removeAll();
++ for (final WebRadio radio : WebRadioManager.getInstance().getWebRadios()) {
++ String label = radio.getName();
++ if (UtilString.isNotEmpty(radio.getGenre())) {
++ label += " [" + radio.getGenre() + "]";
++ }
++ JMenuItem jmi = new JMenuItem(label);
++ jmi.addActionListener(new ActionListener() {
++ @Override
++ public void actionPerformed(ActionEvent e) {
++ Conf.setProperty(Const.CONF_DEFAULT_WEB_RADIO, radio.getName());
++ // force to reselect the item
++ populateWebRadios();
++ // update action tooltip on main button with right item
++ JajukAction action = ActionManager.getAction(JajukActions.WEB_RADIO);
++ action.setShortDescription(Const.HTML + Messages.getString("CommandJPanel.25")
++ + Const.P_B + radio.getName() + Const.B_P_HTML);
++ // Actually launch the webradio
++ try {
++ action.perform(null);
++ } catch (Exception e1) {
++ Log.error(e1);
++ }
++ }
++ });
++ webradios.add(jmi);
+ }
+- }
+- });
+- jmi.setSelected(Conf.getString(Const.CONF_DEFAULT_WEB_RADIO).equals(radio.getName()));
+- // Show the check icon
+- jmi.setDisplayCheck(true);
+- popupWebRadio.add(jmi);
+- }
+- // Force popup resizing
+- popupWebRadio.init();
+- } catch (Exception e) {
+- Log.error(e);
++ } catch (Exception e) {
++ Log.error(e);
++ }
+ }
+- }
+ }
diff --git a/debian/patches/series b/debian/patches/series
index 791becb..c9d4c89 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -3,3 +3,4 @@
03_remove_WindowsHotKeyManager.patch
04_disable_update_check.patch
05_fix_version.patch
+06_scrolling_stuff.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jajuk.git
More information about the pkg-java-commits
mailing list