swingx-master/swingx-core/src/test/java/org/jdesktop/swingx/decorator/HighlighterClientVisualCheck.java
/*
 * $Id$
 *
 * Copyright 2007 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library 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
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */
package org.jdesktop.swingx.decorator;

import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;

import org.jdesktop.swingx.InteractiveTestCase;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.action.AbstractActionExt;
import org.jdesktop.swingx.decorator.HighlightPredicate.ColumnHighlightPredicate;
import org.jdesktop.swingx.decorator.HighlighterFactory.UIColorHighlighter;
import org.jdesktop.swingx.renderer.DefaultTableRenderer;
import org.jdesktop.swingx.renderer.IconValue;
import org.jdesktop.swingx.renderer.StringValues;
import org.jdesktop.swingx.test.XTestUtils;
import org.jdesktop.swingx.treetable.FileSystemModel;
import org.jdesktop.test.AncientSwingTeam;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;


/**
 * TODO add type doc
 * 
 * @author Jeanette Winzenburg
 */
@RunWith(JUnit4.class)
public class HighlighterClientVisualCheck extends InteractiveTestCase  {
    
    public static void main(String[] args) {
        HighlighterClientVisualCheck test = new HighlighterClientVisualCheck();
        try {
            test.runInteractiveTests();
//            test.runInteractiveTests("interactive.*ToolTip.*");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void interactiveComponentOrientation() {
        JXTable table = new JXTable(new AncientSwingTeam());
        ComponentOrientation orientation = table.getComponentOrientation().isLeftToRight() ? 
                ComponentOrientation.RIGHT_TO_LEFT : ComponentOrientation.LEFT_TO_RIGHT;
        table.getColumnExt(0).addHighlighter(new ComponentOrientationHighlighter(orientation ));
        showWithScrollingInFrame(table, "Alternative CO in first column");
    }

    /**
     * Issue #1317-swingx: PatternPredicate throws exception if testColumn -1 (== all)
     */
    public void interactivePatternPredicate() {
        JXTable table = new JXTable(new AncientSwingTeam());
        final ColorHighlighter hl = new ColorHighlighter(HighlightPredicate.NEVER, Color.LIGHT_GRAY, null);
        table.addHighlighter(hl);
        JXFrame frame = wrapWithScrollingInFrame(table, "use pattern predicate");
        Action action = new AbstractActionExt("togglePredicate") {
            
            PatternPredicate testFirstHighlightAll = new PatternPredicate(".*a.*", 0, PatternPredicate.ALL);
            PatternPredicate testFirstHighlightFirst = new PatternPredicate(".*a.*", 0, 0);
            PatternPredicate testFirstHighlightSecond = new PatternPredicate(".*a.*", 0, 1);
            PatternPredicate testAllHighlightFirst = new PatternPredicate(".*a.*", PatternPredicate.ALL, 0);
            PatternPredicate testAllHighlightAll = new PatternPredicate(".*a.*", PatternPredicate.ALL, PatternPredicate.ALL);
            int current;
            
            HighlightPredicate[] predicates = new HighlightPredicate[] {
               HighlightPredicate.NEVER,
               testFirstHighlightAll,
               testFirstHighlightFirst,
               testFirstHighlightSecond,
               testAllHighlightFirst,
               testAllHighlightAll,
            };
            
            @Override
            public void actionPerformed(ActionEvent e) {
                current++;
                if (current == predicates.length) {
                    current = 0;
                }
                hl.setHighlightPredicate(predicates[current]);
            }
        };
        addAction(frame, action);
        show(frame);
    }
    
    

    /**
     * Regression Issue ?? swingx: column highlighter change must update view.
     */
    public void interactiveColumnHighlighterChange() {
        final ColorHighlighter hl = new ColorHighlighter(HighlightPredicate.ODD, Color.RED, Color.BLACK);
        JXTable table = new JXTable(new AncientSwingTeam());
        table.getColumnExt(0).addHighlighter(hl);
        Action action = new AbstractAction("toggle column color") {

            @Override
            public void actionPerformed(ActionEvent e) {
                Color old = hl.getBackground();
                hl.setBackground(old == Color.red ? Color.ORANGE : Color.RED);
               
            }
            
        };
        table.addHighlighter(new ColorHighlighter(HighlightPredicate.ROLLOVER_ROW, null, Color.RED));
        JXFrame frame = wrapWithScrollingInFrame(table, "column highlighter update");
        addAction(frame, action);
        addMessage(frame, "toggle column color between orange/red must update immediately");
        show(frame);
    }


    
    /**
     * UI-dependent Column highlighter must updated on updateUI.
     */
    public void interactiveColumnHighlighterUpdateUI() {
        JXTable table = new JXTable(new AncientSwingTeam());
        table.getColumnExt(2).addHighlighter(new UIColorHighlighter());
        table.addHighlighter(new UIColorHighlighter(new ColumnHighlightPredicate(1)));
        showWithScrollingInFrame(table, "UpdateUI - table highlighter in second, column highlighter in third");
    }

    /**
     * Issue 1314: visual interaction of truncated text and tool tip highlighter.
     */
    public void interactiveToolTipOnTruncatedText() {
        JXTable table = new JXTable(new AncientSwingTeam());
        final Icon icon = XTestUtils.loadDefaultIcon();
        IconValue iv = new IconValue() {
            
            @Override
            public Icon getIcon(Object value) {
                return icon;
            }
        };
        table.getColumn(AncientSwingTeam.COLOR_COLUMN).setCellRenderer(new DefaultTableRenderer(StringValues.TO_STRING, iv));
        table.addHighlighter(new ToolTipHighlighter(HighlightPredicate.IS_TEXT_TRUNCATED));
        JXFrame frame = showWithScrollingInFrame(table, "ToolTip on truncated text");
        addComponentOrientationToggle(frame);
    }
}
