/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * 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 org.drools.examples.sudoku.swing; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.GridLayout; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTextField; public class SudokuGridView extends JComponent implements SudokuGridListener, ComponentListener { private static final long serialVersionUID = 510l; private SudokuGridModel model; private GridLayout gridLayout; private JTextField textFields[][]; public SudokuGridView(){ gridLayout = new GridLayout(SudokuGridModel.NUM_ROWS, SudokuGridModel.NUM_COLS); setLayout(gridLayout); textFields = new JTextField[SudokuGridModel.NUM_ROWS][SudokuGridModel.NUM_COLS]; for (int row=0; row<textFields.length; row++) { for (int col=0; col<textFields[row].length; col++){ JTextField textField = new JTextField(""); textField.setEditable(false); if (row==0 && col==0) { textField.addComponentListener(this); } JPanel panel = new JPanel(); int top = row % SudokuGridModel.INNER_GRID_HEIGHT == 0 ? 2 : 0; int left = col % SudokuGridModel.INNER_GRID_WIDTH == 0 ? 2 : 0; int bottom = row == SudokuGridModel.NUM_ROWS-1 ? 2 : 0; int right = col == SudokuGridModel.NUM_COLS-1 ? 2 : 0; panel.setBorder(BorderFactory.createMatteBorder( top, left, bottom, right, Color.BLACK )); panel.setLayout(new BorderLayout()); textField.setOpaque(true); textField.setBackground(Color.WHITE); textField.setHorizontalAlignment(JTextField.CENTER); textFields[row][col] = textField; panel.add(BorderLayout.CENTER, textField); add(panel); } } } public SudokuGridView(SudokuGridModel model){ this(); setModel(model); } public void setModel(SudokuGridModel model){ if (this.model != null && this.model instanceof AbstractSudokuGridModel){ ((AbstractSudokuGridModel) this.model).removeSudokuGridListener(this); } this.model = model; refreshValues(); if (this.model != null && this.model instanceof AbstractSudokuGridModel){ ((AbstractSudokuGridModel) this.model).addSudokuGridListener(this); } } private void refreshValues() { for (int row=0; row<textFields.length; row++) { for (int col=0; col<textFields[row].length; col++) { refreshValue(row, col); } } } private void refreshValue(int row, int col){ String contents = model.getCellValue( row, col ); textFields[row][col].setText( contents ); } public void restart(SudokuGridEvent ev){ refreshValues(); } public void cellModified(SudokuGridEvent ev){ refreshValue(ev.getRow(), ev.getCol()); } public void componentHidden(ComponentEvent ev){ // FIXME componentHidden } public void componentMoved(ComponentEvent ev){ // FIXME componentMoved } public void componentResized(ComponentEvent ev){ JTextField textField = (JTextField) ev.getComponent(); int height = textField.getHeight(); Font font = textField.getFont(); FontMetrics fontMetrics = textField.getGraphics().getFontMetrics(font); if (fontMetrics.getAscent() < height){ while (fontMetrics.getAscent() < height){ font = new Font(font.getName(), font.getStyle(), font.getSize()+2); fontMetrics = textField.getGraphics().getFontMetrics(font); } } else if (fontMetrics.getAscent() > height){ while (fontMetrics.getAscent() > height){ font = new Font(font.getName(), font.getStyle(), font.getSize()-2); fontMetrics = textField.getGraphics().getFontMetrics(font); } } else{ // } for (int row=0; row<textFields.length; row++){ for (int col=0; col<textFields[row].length; col++){ textFields[row][col].setFont(font); } } } public void componentShown(ComponentEvent ev){ // FIXME componentShown } }