余録

from os.path import dirname, exists
from sys import argv

from java.awt import BorderLayout
from java.awt import Font
from javax.swing import ImageIcon
from javax.swing import JFrame
from javax.swing import JLabel
from javax.swing import JPanel
from javax.swing import JScrollPane
from javax.swing import JSplitPane
from javax.swing import JTabbedPane
from javax.swing import JTable
from javax.swing import JTextArea
from javax.swing import ListSelectionModel
from javax.swing.table import DefaultTableModel

## ----------------------------------------
class GroupListPanel(JPanel):

    groupTabs = "ABCDEFGH"
    groups = {
        "A": [                          # Group A
            {"rsa": "South Africa"},
            {"mex": "Mexico"},
            {"uru": "Uruguay"},
            {"fra": "France"},
            ],
        "B": [                          # Group B
            {"arg": "Argentina"},
            {"nga": "Nigeria"},
            {"kor": "Korea Republic"},
            {"gre": "Greece"},
            ],
        "C": [                          # Group C
            {"eng": "England"},
            {"usa": "USA"},
            {"alg": "Algeria"},
            {"svn": "Slovenia"},
            ],
        "D": [                          # Group D
            {"ger": "Germany"},
            {"aus": "Australia"},
            {"srb": "Serbia"},
            {"gha": "Ghana"},
            ],
        "E": [                          # Group E
            {"ned": "Netherlands"},
            {"den": "Denmark"},
            {"jpn": "Japan"},
            {"cmr": "Cameroon"},
            ],
        "F": [                          # Group F
            {"ita": "Italy"},
            {"par": "Paraguay"},
            {"nzl": "New Zealand"},
            {"svk": "Slovakia"},
            ],
        "G": [                          # Group G
            {"bra": "Brazil"},
            {"prk": "Korea DPR"},
            {"civ": "Cote d Ivoire"},
            {"por": "Portugal"},
            ],
        "H": [                          # Group H
            {"esp": "Spain"},
            {"sui": "Switzerland"},
            {"hon": "Honduras"},
            {"chi": "Chile"},
            ],
        }
    teamNames = dict*1
    """
Group A
Team	MP	W	D	L	GF	GA	Pts
Uruguay	2	1	1	0	3	0	4
Mexico	2	1	1	0	3	1	4
France	2	0	1	1	0	2	1
South Africa	2	0	1	1	1	4	1

Group B
Team	MP	W	D	L	GF	GA	Pts
Argentina	2	2	0	0	5	1	6
Korea Republic	2	1	0	1	3	4	3
Greece	2	1	0	1	2	3	3
Nigeria	2	0	0	2	1	3	0

Group C
Team	MP	W	D	L	GF	GA	Pts
Slovenia	1	1	0	0	1	0	3
USA	1	0	1	0	1	1	1
England	1	0	1	0	1	1	1
Algeria	1	0	0	1	0	1	0

Group D
Team	MP	W	D	L	GF	GA	Pts
Germany	2	1	0	1	4	1	3
Ghana	1	1	0	0	1	0	3
Serbia	2	1	0	1	1	1	3
Australia	1	0	0	1	0	4	0

Group E
Team	MP	W	D	L	GF	GA	Pts
Netherlands	1	1	0	0	2	0	3
Japan	1	1	0	0	1	0	3
Cameroon	1	0	0	1	0	1	0
Denmark	1	0	0	1	0	2	0

Group F
Team	MP	W	D	L	GF	GA	Pts
Paraguay	1	0	1	0	1	1	1
Italy	1	0	1	0	1	1	1
New Zealand	1	0	1	0	1	1	1
Slovakia	1	0	1	0	1	1	1

Group G
Team	MP	W	D	L	GF	GA	Pts
Brazil	1	1	0	0	2	1	3
Côte d'Ivoire	1	0	1	0	0	0	1
Portugal	1	0	1	0	0	0	1
Korea DPR	1	0	0	1	1	2	0

Group H
Team	MP	W	D	L	GF	GA	Pts
Chile	1	1	0	0	1	0	3
Switzerland	1	1	0	0	1	0	3
Honduras	1	0	0	1	0	1	0
Spain	1	0	0	1	0	1	0
    """
    scores = {
        # Group A
        "uru": (2, 1, 1, 0, 3, 0, 4),
        "mex": (2, 1, 1, 0, 3, 1, 4),
        "fra": (2, 0, 1, 1, 0, 2, 1),
        "rsa": (2, 0, 1, 1, 1, 4, 1),
        # Group B
        "arg": (2, 2, 0, 0, 5, 1, 6),
        "kor": (2, 1, 0, 1, 3, 4, 3),
        "gre": (2, 1, 0, 1, 2, 3, 3),
        "nga": (2, 0, 0, 2, 1, 3, 0),
        # Group C
        "svn": (1, 1, 0, 0, 1, 0, 3),
        "usa": (1, 0, 1, 0, 1, 1, 1),
        "eng": (1, 0, 1, 0, 1, 1, 1),
        "alg": (1, 0, 0, 1, 0, 1, 0),
        # Group D
        "ger": (2, 1, 0, 1, 4, 1, 3),
        "gha": (1, 1, 0, 0, 1, 0, 3),
        "srb": (2, 1, 0, 1, 1, 1, 3),
        "aus": (1, 0, 0, 1, 0, 4, 0),
        # Group E
        "ned": (1, 1, 0, 0, 2, 0, 3),
        "jpn": (1, 1, 0, 0, 1, 0, 3),
        "cmr": (1, 0, 0, 1, 0, 1, 0),
        "den": (1, 0, 0, 1, 0, 2, 0),
        # Group F
        "par": (1, 0, 1, 0, 1, 1, 1),
        "ita": (1, 0, 1, 0, 1, 1, 1),
        "nzl": (1, 0, 1, 0, 1, 1, 1),
        "svk": (1, 0, 1, 0, 1, 1, 1),
        # Group G
        "bra": (1, 1, 0, 0, 2, 1, 3),
        "civ": (1, 0, 1, 0, 0, 0, 1),
        "por": (1, 0, 1, 0, 0, 0, 1),
        "prk": (1, 0, 0, 1, 1, 2, 0),
        # Group H
        "chi": (1, 1, 0, 0, 1, 0, 3),
        "sui": (1, 1, 0, 0, 1, 0, 3),
        "hon": (1, 0, 0, 1, 0, 1, 0),
        "esp": (1, 0, 0, 1, 0, 1, 0),
        }

    def __init__(self, master, *args, **keys):
        self.teams = {}
        self.label = {}
        self.textArea = {}
        self.tab = None

        def splitPane(group):
            controlPane = self._controlPane(
                group = group,
                minimumSize = (200,84),
                )
            canvasPane = self._canvasPane(
                group = group,
                minimumSize = (200,50),
                )
            return self._splitPane(
                leftComponent  = controlPane,
                rightComponent = canvasPane,
                )
        
        master.contentPane = self._tabbedPane(
            panes = dict((e, splitPane(e)) for e in self.groupTabs),
            )
        self._update("South Africa")

    ## ----------------------------------------
    def _controlPane(self, group, minimumSize, **keys):
        columnNames = "Team","MP","W","D","L","GF","GA","Pts",

        def teams(group):
            return [(k,v) for team in self.groups[group]
                for k,v in team.items()]

        def tableModel():
            self.teams[group] = \
            model = DefaultTableModel()
            for e in columnNames:
                model.addColumn(e)
            for k,v in teams(group):
                model.addRow([v]+list(self.scores[k]))
            return model

        def view():
            comp = JTable(
                model = tableModel(),
                )
            comp.selectionModel.valueChanged = self

            model = comp.columnModel
            model.getColumn(0).preferredWidth = 100
            for i in range(1, model.columnCount):
                model.getColumn(i).preferredWidth = 30
            return comp
        
        pane = JScrollPane(
            viewportView = view(),
            minimumSize = minimumSize,
            )
        return pane

    ## ----------------------------------------
    def _canvasPane(self, group, minimumSize, **keys):
        comp = JPanel(
            layout = BorderLayout(),
            )
        for layout, e in [
            ("WEST"  , self._labelPane(group)            ),
            ("CENTER", self._textPane(group, minimumSize)),
            ]:
            comp.add(e, getattr(BorderLayout, layout))
        return comp

    def _labelPane(self, group, **keys):
        def view():
            self.label[group] = \
            comp = JLabel(
                horizontalAlignment = JLabel.CENTER,
                horizontalTextPosition = JLabel.CENTER,
                verticalTextPosition = JLabel.BOTTOM,
                preferredSize = (100,50),
                )
            comp.font = comp.font.deriveFont(Font.ITALIC)
            return comp        

        comp = view()
        return comp

    def _textPane(self, group, minimumSize, **keys):
        def view():
            self.textArea[group] = \
            comp = JTextArea(
                lineWrap = True,
                wrapStyleWord = True,
                )
            comp.font = comp.font.deriveFont(Font.ITALIC)
            return comp        

        comp = JScrollPane(
            viewportView = view(),
            minimumSize = minimumSize,
            )
        return comp

    def _splitPane(self, **keys):
        comp = JSplitPane(
            orientation = JSplitPane.VERTICAL_SPLIT,
            oneTouchExpandable = True,
            dividerLocation = 90,
            **keys
            )
        return comp

    def _tabbedPane(self, panes, **keys):
        def stateChanged(e):
            index = e.source.selectedIndex
            self.tab = self.groupTabs[index]

        comp = JTabbedPane(
            stateChanged = stateChanged,
            )
        for e in self.groupTabs:
            comp.addTab(e, panes[e])
        return comp
        
    ## ----------------------------------------
    def __call__(self, e):    # ListSelectionListener.valueChanged
        row = e.source.leadSelectionIndex
        value = self.teams[self.tab].getValueAt(row, 0)
        self._update(value)

    def _update(self, value=None):
        def name(key):
            for group in self.groups.values():
                for team in group:
                    if key in team:
                        return team[key]
            else:
                return None

        def imageIcon(path):
            return ImageIcon(path) if exists(path) else None

        def update_label(tab, path):
            comp = self.label[tab]
            comp.icon = imageIcon(
                "%s/squad/%s.gif"%(path, self.teamNames[value]))
            comp.text = value

        def contents(path):
            return "".join([e for e in open(path)]) if exists(path) else None

        def update_textArea(tab, path):
            comp = self.textArea[tab]
            text = contents(
                "%s/profile/%s.txt"%(path, value))
            comp.text = text if text else "*** File not found ***"
            comp.caretPosition = 0

        tab = self.tab
        path = dirname(argv[-1])
        update_label(tab, path)
        update_textArea(tab, path)

def tips():
    frame = JFrame(
        title = u"2010 FIFA World Cup South Africa™",
        size = (350,300),
        defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
        locationRelativeTo = None,
        )
    GroupListPanel(frame)
    frame.show()

*1:v,k) for group in groups.values() for team in group for k,v in team.items(