/**
* L2FProd.com Common Components 7.3 License.
*
* Copyright 2005-2007 L2FProd.com
*
* Licensed 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 com.l2fprod.common.swing.plaf.basic;
import com.l2fprod.common.swing.ButtonAreaLayout;
import com.l2fprod.common.swing.JTipOfTheDay;
import com.l2fprod.common.swing.JTipOfTheDay.ShowOnStartupChoice;
import com.l2fprod.common.swing.LookAndFeelTweaks;
import com.l2fprod.common.swing.TipModel.Tip;
import com.l2fprod.common.swing.plaf.TipOfTheDayUI;
import javax.swing.*;
import javax.swing.plaf.ActionMapUIResource;
import javax.swing.plaf.ComponentUI;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class BasicTipOfTheDayUI extends TipOfTheDayUI {
public static ComponentUI createUI(JComponent c) {
return new BasicTipOfTheDayUI((JTipOfTheDay) c);
}
protected JTipOfTheDay tipPane;
protected JPanel tipArea;
protected Component currentTipComponent;
protected Font tipFont;
protected PropertyChangeListener changeListener;
public BasicTipOfTheDayUI(JTipOfTheDay tipPane) {
this.tipPane = tipPane;
}
public JDialog createDialog(Component parentComponent, final ShowOnStartupChoice choice) {
return createDialog(parentComponent, choice, true);
}
protected JDialog createDialog(Component parentComponent, final ShowOnStartupChoice choice, boolean showPreviousButton) {
String title = UIManager.getString("TipOfTheDay.dialogTitle");
final JDialog dialog;
Window window;
if (parentComponent == null) {
window = JOptionPane.getRootFrame();
} else {
window = (parentComponent instanceof Window) ? (Window) parentComponent : SwingUtilities.getWindowAncestor(parentComponent);
}
if (window instanceof Frame) {
dialog = new JDialog((Frame) window, title, true);
} else {
dialog = new JDialog((Dialog) window, title, true);
}
dialog.getContentPane().setLayout(new BorderLayout(10, 10));
dialog.getContentPane().add("Center", tipPane);
((JComponent) dialog.getContentPane()).setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
final JCheckBox showOnStartupBox;
// tip controls
JPanel controls = new JPanel(new BorderLayout());
dialog.getContentPane().add("South", controls);
if (choice != null) {
showOnStartupBox = new JCheckBox(UIManager.getString("TipOfTheDay.showOnStartupText"), choice.isShowingOnStartup());
controls.add("Center", showOnStartupBox);
} else {
showOnStartupBox = null;
}
JPanel buttons = new JPanel(new ButtonAreaLayout(9));
controls.add("East", buttons);
if (showPreviousButton) {
JButton previousTipButton = new JButton(UIManager.getString("TipOfTheDay.previousTipText"));
buttons.add(previousTipButton);
previousTipButton.addActionListener(getActionMap().get("previousTip"));
}
JButton nextTipButton = new JButton(UIManager.getString("TipOfTheDay.nextTipText"));
buttons.add(nextTipButton);
nextTipButton.addActionListener(getActionMap().get("nextTip"));
JButton closeButton = new JButton(UIManager.getString("TipOfTheDay.closeText"));
buttons.add(closeButton);
final ActionListener saveChoice = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (choice != null) {
choice.setShowingOnStartup(showOnStartupBox.isSelected());
}
dialog.setVisible(false);
}
};
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
saveChoice.actionPerformed(null);
}
});
dialog.getRootPane().setDefaultButton(closeButton);
dialog.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
saveChoice.actionPerformed(null);
}
});
((JComponent) dialog.getContentPane())
.registerKeyboardAction(saveChoice, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
dialog.pack();
dialog.setLocationRelativeTo(parentComponent);
return dialog;
}
public void installUI(JComponent c) {
super.installUI(c);
installDefaults();
installKeyboardActions();
installComponents();
installListeners();
showCurrentTip();
}
protected void installKeyboardActions() {
ActionMap map = getActionMap();
if (map != null) {
SwingUtilities.replaceUIActionMap(tipPane, map);
}
}
ActionMap getActionMap() {
ActionMap map = new ActionMapUIResource();
map.put("previousTip", new PreviousTipAction());
map.put("nextTip", new NextTipAction());
return map;
}
protected void installListeners() {
changeListener = createChangeListener();
tipPane.addPropertyChangeListener(changeListener);
}
protected PropertyChangeListener createChangeListener() {
return new ChangeListener();
}
protected void installDefaults() {
LookAndFeel.installColorsAndFont(tipPane, "TipOfTheDay.background", "TipOfTheDay.foreground", "TipOfTheDay.font");
LookAndFeel.installBorder(tipPane, "TipOfTheDay.border");
tipFont = UIManager.getFont("TipOfTheDay.tipFont");
tipPane.setOpaque(true);
}
protected void installComponents() {
tipPane.setLayout(new BorderLayout());
// tip icon
JLabel tipIcon = new JLabel(UIManager.getString("TipOfTheDay.didYouKnowText"));
tipIcon.setIcon(UIManager.getIcon("TipOfTheDay.icon"));
tipIcon.setBorder(BorderFactory.createEmptyBorder(22, 15, 22, 15));
tipPane.add("North", tipIcon);
// tip area
tipArea = new JPanel(new BorderLayout(2, 2));
tipArea.setOpaque(false);
tipArea.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
tipPane.add("Center", tipArea);
}
public Dimension getPreferredSize(JComponent c) {
return new Dimension(420, 175);
}
protected void showCurrentTip() {
if (currentTipComponent != null) {
tipArea.remove(currentTipComponent);
}
int currentTip = tipPane.getCurrentTip();
if (currentTip == -1) {
JLabel label = new JLabel();
label.setOpaque(true);
label.setBackground(UIManager.getColor("TextArea.background"));
currentTipComponent = label;
tipArea.add("Center", currentTipComponent);
return;
}
// tip does not fall in current tip range
if (tipPane.getModel().getTipCount() == 0 || (currentTip < 0 && currentTip >= tipPane.getModel().getTipCount())) {
currentTipComponent = new JLabel();
} else {
Tip tip = tipPane.getModel().getTipAt(currentTip);
Object tipObject = tip.getTip();
if (tipObject instanceof Component) {
currentTipComponent = (Component) tipObject;
} else if (tipObject instanceof Icon) {
currentTipComponent = new JLabel((Icon) tipObject);
} else {
JScrollPane tipScroll = new JScrollPane();
tipScroll.setBorder(null);
tipScroll.setOpaque(false);
tipScroll.getViewport().setOpaque(false);
tipScroll.setBorder(null);
String text = tipObject == null ? "" : tipObject.toString();
if (text.toLowerCase().startsWith("<html>")) {
JEditorPane editor = new JEditorPane("text/html", text);
LookAndFeelTweaks.htmlize(editor, tipPane.getFont());
editor.setEditable(false);
editor.setBorder(null);
editor.setMargin(null);
editor.setOpaque(false);
tipScroll.getViewport().setView(editor);
} else {
JTextArea area = new JTextArea(text);
area.setFont(tipPane.getFont());
area.setEditable(false);
area.setLineWrap(true);
area.setWrapStyleWord(true);
area.setBorder(null);
area.setMargin(null);
area.setOpaque(false);
tipScroll.getViewport().setView(area);
}
currentTipComponent = tipScroll;
}
}
tipArea.add("Center", currentTipComponent);
tipArea.revalidate();
tipArea.repaint();
}
public void uninstallUI(JComponent c) {
uninstallListeners();
uninstallComponents();
uninstallDefaults();
super.uninstallUI(c);
}
protected void uninstallListeners() {
tipPane.removePropertyChangeListener(changeListener);
}
protected void uninstallComponents() {}
protected void uninstallDefaults() {}
class ChangeListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
if (JTipOfTheDay.CURRENT_TIP_CHANGED_KEY.equals(evt.getPropertyName())) {
showCurrentTip();
}
}
}
class PreviousTipAction extends AbstractAction {
public PreviousTipAction() {
super("previousTip");
}
public void actionPerformed(ActionEvent e) {
tipPane.previousTip();
}
public boolean isEnabled() {
return tipPane.isEnabled();
}
}
class NextTipAction extends AbstractAction {
public NextTipAction() {
super("nextTip");
}
public void actionPerformed(ActionEvent e) {
tipPane.nextTip();
}
public boolean isEnabled() {
return tipPane.isEnabled();
}
}
}