OSDN Git Service

Better centering in cells and added true Arabic numbers
authorSylvain Vedrenne <svedrenne@jankenpoi.net>
Fri, 28 Dec 2012 18:35:47 +0000 (19:35 +0100)
committerSylvain Vedrenne <svedrenne@jankenpoi.net>
Fri, 28 Dec 2012 18:35:47 +0000 (19:35 +0100)
src/classes/net/jankenpoi/sudokuki/ui/swing/NumbersMenu.java
src/classes/net/jankenpoi/sudokuki/ui/swing/PrintMultiDialog.java
src/classes/net/jankenpoi/sudokuki/ui/swing/SwingGrid.java
src/classes/net/jankenpoi/sudokuki/ui/swing/SwingMultiGrid.java

index 285462d..d3f1ed5 100644 (file)
@@ -36,31 +36,41 @@ import net.jankenpoi.sudokuki.ui.L10nComponent;
 public class NumbersMenu extends JMenu implements L10nComponent {\r
 \r
        private final SwingView view;\r
-       private final JRadioButtonMenuItem itemArabicNumbers = new JRadioButtonMenuItem();\r
+       private final JRadioButtonMenuItem itemStandardNumbers = new JRadioButtonMenuItem();\r
        private final JRadioButtonMenuItem itemChineseNumbers = new JRadioButtonMenuItem();\r
-       private final Action actionArabicNumbers;\r
+       private final JRadioButtonMenuItem itemArabicNumbers = new JRadioButtonMenuItem();\r
+    private final Action actionStandardNumbers;\r
        private final Action actionChineseNumbers;\r
+       private final Action actionArabicNumbers;\r
        private LocaleListenerImpl localeListener;\r
 \r
        public NumbersMenu(SwingView view) {\r
                this.view = view;\r
 \r
-               actionArabicNumbers = new AbstractAction(_("Arabic"), null) {\r
-\r
-                       @Override\r
-                       public void actionPerformed(ActionEvent arg0) {\r
-                               setKanjiMode(false);\r
-                       }\r
+               actionStandardNumbers = new AbstractAction(_("Standard"), null) {\r
+                   \r
+                   @Override\r
+                   public void actionPerformed(ActionEvent arg0) {\r
+                       setNumbersMode(0);\r
+                   }\r
                };\r
                \r
                actionChineseNumbers = new AbstractAction(_("Chinese"), null) {\r
 \r
                        @Override\r
                        public void actionPerformed(ActionEvent arg0) {\r
-                               setKanjiMode(true);\r
+                           setNumbersMode(1);\r
                        }\r
                };\r
 \r
+               actionArabicNumbers = new AbstractAction(_("Arabic"), null) {\r
+                   \r
+                   @Override\r
+                   public void actionPerformed(ActionEvent arg0) {\r
+                       setNumbersMode(2);\r
+                   }\r
+               };\r
+               \r
                addItems();\r
                setIcon(StockIcons.ICON_FONT);\r
                \r
@@ -74,29 +84,35 @@ public class NumbersMenu extends JMenu implements L10nComponent {
        @Override\r
        public void setL10nMessages(Locale locale, String languageCode) {\r
                setText(_("Numbers"));\r
-               itemArabicNumbers.setText(_("Arabic"));\r
+               itemStandardNumbers.setText(_("Standard"));\r
                itemChineseNumbers.setText(_("Chinese"));\r
+               itemArabicNumbers.setText(_("Arabic"));\r
        }\r
        \r
        private void addItems() {\r
                \r
                ButtonGroup numbersGroup = new ButtonGroup();\r
                \r
-               boolean kanjiMode = UserPreferences.getInstance().getBoolean("KanjiMode", false);\r
-               \r
-               itemArabicNumbers.setAction(actionArabicNumbers);\r
-               numbersGroup.add(itemArabicNumbers);\r
-               itemArabicNumbers.setSelected(!kanjiMode);\r
-               add(itemArabicNumbers);\r
+               int numbersMode = UserPreferences.getInstance().getInteger("NumbersMode", Integer.valueOf(0)).intValue();\r
                \r
+        itemStandardNumbers.setAction(actionStandardNumbers);\r
+        numbersGroup.add(itemStandardNumbers);\r
+        itemStandardNumbers.setSelected(numbersMode == 0);\r
+        add(itemStandardNumbers);\r
+        \r
                itemChineseNumbers.setAction(actionChineseNumbers);\r
                numbersGroup.add(itemChineseNumbers);\r
-               itemChineseNumbers.setSelected(kanjiMode);\r
+               itemChineseNumbers.setSelected(numbersMode == 1);\r
                add(itemChineseNumbers);\r
+               \r
+               itemArabicNumbers.setAction(actionArabicNumbers);\r
+               numbersGroup.add(itemArabicNumbers);\r
+               itemArabicNumbers.setSelected(numbersMode == 2);\r
+               add(itemArabicNumbers);\r
        }\r
        \r
-       private void setKanjiMode(boolean mode) {\r
-               UserPreferences.getInstance().set("kanjiMode", mode);\r
+       private void setNumbersMode(int mode) {\r
+               UserPreferences.getInstance().set("numbersMode", Integer.valueOf(mode));\r
                view.getController().notifyGridChanged();\r
        }\r
        \r
index cb6dcfb..13e6634 100644 (file)
@@ -73,7 +73,7 @@ public class PrintMultiDialog extends JDialog {
                        @Override\r
                        /* Executed in the SwingWorker thread */\r
                        protected Integer doInBackground() {\r
-                               return generateFourGrids();\r
+                               return Integer.valueOf(generateFourGrids());\r
                        }\r
 \r
                        @Override\r
@@ -163,8 +163,8 @@ public class PrintMultiDialog extends JDialog {
                if (dialogCancelled()) {\r
                        return 1;\r
                }\r
-               final int minRating = UserPreferences.getInstance().getInteger("minRating", 0);\r
-               final int maxRating = UserPreferences.getInstance().getInteger("maxRating", Integer.MAX_VALUE);\r
+               final int minRating = UserPreferences.getInstance().getInteger("minRating", Integer.valueOf(0)).intValue();\r
+               final int maxRating = UserPreferences.getInstance().getInteger("maxRating", Integer.valueOf(Integer.MAX_VALUE)).intValue();\r
                SudokuGrid su1 = SudokuGeneratorFactory.getGenerator().generateGrid(minRating, maxRating);\r
                if (dialogCancelled()) {\r
                        return 1;\r
index dcd0417..b8404e7 100644 (file)
@@ -57,9 +57,7 @@ public class SwingGrid extends JPanel implements Printable {
 
        private static final int CELL_SIZE = 26;
 
-       private int FONT_SIZE = 20;
-       // private static final int CELL_SIZE = 22;
-       // private int FONT_SIZE = 18;
+       private int FONT_SIZE = 22;
 
        private MouseListener innerMouseListener = new InnerMouseListener();
 
@@ -84,8 +82,8 @@ public class SwingGrid extends JPanel implements Printable {
                addMouseListener(innerMouseListener);
                addKeyListener(innerKeyListener);
                setPreferredSize(new Dimension(columns[columns.length - 1].getEnd()
-                               - columns[0].getStart() + offX * 2,
-                               rows[rows.length - 1].getEnd() - rows[0].getStart() + offY * 2));
+                               - columns[0].getStart() + offX * 2 + 1,
+                               rows[rows.length - 1].getEnd() - rows[0].getStart() + offY * 2 + 1));
        }
 
        /**
@@ -98,19 +96,19 @@ public class SwingGrid extends JPanel implements Printable {
         * @return A Point giving the position where to draw the digit for cell (li,
         *         co)
         */
-       private Point getPosition(Graphics2D g2, int li, int co) {
+       private Point getPosition(Graphics2D g2, int li, int co, String digit) {
                if (!(0 <= li && li < 9 && 0 <= co && co < 9)) {
                        throw new IllegalArgumentException();
                }
 
                FontMetrics fm = getFontMetrics(g2.getFont());
                int h = fm.getHeight();
-               int w = fm.stringWidth("X");
+               int w = fm.stringWidth(digit);
 
-               int x = columns[co].getStart() + CELL_SIZE / 2 - w / 2;
-               int y = rows[li].getStart() + CELL_SIZE / 2 + h / 4;
+               int x = columns[co].getStart() + (CELL_SIZE - w ) / 2;
+               int y = rows[li].getStart() + (CELL_SIZE + h / 2) / 2;
 
-               return new Point(x, y);
+               return new Point(x, y + 1);
        }
 
        /**
@@ -148,68 +146,41 @@ public class SwingGrid extends JPanel implements Printable {
                
                paintGridBoard(g2);
                paintFocusMark(g2);
-               boolean kanjiMode = UserPreferences.getInstance().getBoolean("kanjiMode", false);
-               paintGridNumbers(g2, kanjiMode);
+               int numbersMode = UserPreferences.getInstance().getInteger("numbersMode", Integer.valueOf(0)).intValue();
+               paintGridNumbers(g2, numbersMode);
                paintPlayerMemos(g2);
-               paintPlayerNumbers(g2, kanjiMode);
+               paintPlayerNumbers(g2, numbersMode);
        }
 
 
-       private void paintGridNumbers(Graphics2D g2, boolean kanjiMode) {
+       private void paintGridNumbers(Graphics2D g2, int numbersMode) {
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);
                g2.setColor(Color.BLACK);
                // Font font = new Font("Serif", Font.BOLD, FONT_SIZE);
                Font font = new Font("Serif", Font.BOLD, FONT_SIZE
-                               - (kanjiMode ? 4 : 0));
+                               - (numbersMode==1 ? 4 : 0));
                g2.setFont(font);
 
                for (int li = 0; li < 9; li++) {
                        for (int co = 0; co < 9; co++) {
                                if (view.isCellReadOnly(li, co)) {
-                                       Point pos = getPosition(g2, li, co);
-                                       g2.drawString(getValueAsStringAt(li, co, kanjiMode), pos.x, pos.y);
+                                   String digit = getValueAsStringAt(li, co, numbersMode);
+                                       Point pos = getPosition(g2, li, co, digit);
+                                       g2.drawString(digit, pos.x, pos.y);
                                }
                        }
                }
        }
 
-       private String getValueAsStringAt(int li, int co, boolean kanjiMode) {
+       private static String[] digits = { "", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+           "", "\u4e00", "\u4E8C", "\u4e09", "\u56DB", "\u4E94", "\u516D", "\u4E03", "\u516B", "\u4E5D",
+        "", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669",
+       };
+       
+       private String getValueAsStringAt(int li, int co, int numbersMode) {
                int value = view.getValueAt(li, co);
-               String result = "";
-               if (kanjiMode) {
-                       switch (value) {
-                       case 1:
-                               result = "\u4e00";
-                               break;
-                       case 2:
-                               result = "\u4E8C";
-                               break;
-                       case 3:
-                               result = "\u4e09";
-                               break;
-                       case 4:
-                               result = "\u56DB";
-                               break;
-                       case 5:
-                               result = "\u4E94";
-                               break;
-                       case 6:
-                               result = "\u516D";
-                               break;
-                       case 7:
-                               result = "\u4E03";
-                               break;
-                       case 8:
-                               result = "\u516B";
-                               break;
-                       case 9:
-                               result = "\u4E5D";
-                               break;
-                       }
-               } else {
-                       result = (value == 0) ? "" : String.valueOf(value);
-               }
+               String result = digits[value + (10 * numbersMode)];
                return result; 
        }
 
@@ -231,10 +202,10 @@ public class SwingGrid extends JPanel implements Printable {
                                CELL_SIZE - 4);
        }
        
-       private void paintPlayerNumbers(Graphics2D g2, boolean kanjiMode) {
+       private void paintPlayerNumbers(Graphics2D g2, int numbersMode) {
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);
-               Font font = new Font("Serif", Font.PLAIN, FONT_SIZE- (kanjiMode?4:0));
+               Font font = new Font("Serif", Font.PLAIN, FONT_SIZE- (numbersMode==1?4:0));
                g2.setFont(font);
 
                GridValidity validity = view.getGridValidity();
@@ -246,12 +217,13 @@ public class SwingGrid extends JPanel implements Printable {
                for (int li = 0; li < 9; li++) {
                        for (int co = 0; co < 9; co++) {
                                if (!view.isCellReadOnly(li, co)) {
-                                       Point pos = getPosition(g2, li, co);
+                                   String digit = getValueAsStringAt(li, co, numbersMode);
+                                   Point pos = getPosition(g2, li, co, digit);
                                        
-                                       if ((firstErrorLine != null && firstErrorLine == li)
-                                                       || (firstErrorColumn != null && firstErrorColumn == co)
-                                                       || ((firstErrorSquareX != null && firstErrorSquareX <= co && co < firstErrorSquareX + 3) &&
-                                                                       ((firstErrorSquareY != null && firstErrorSquareY <= li && li < firstErrorSquareY + 3)))) {
+                                       if ((firstErrorLine != null && firstErrorLine.intValue() == li)
+                                                       || (firstErrorColumn != null && firstErrorColumn.intValue() == co)
+                                                       || ((firstErrorSquareX != null && firstErrorSquareX.intValue() <= co && co < firstErrorSquareX.intValue() + 3) &&
+                                                                       ((firstErrorSquareY != null && firstErrorSquareY.intValue() <= li && li < firstErrorSquareY.intValue() + 3)))) {
                                                g2.setColor(Color.RED);
                                        } else {
                                                if (view.isGrigComplete()) {
@@ -261,7 +233,7 @@ public class SwingGrid extends JPanel implements Printable {
                                                }
                                        }
                                        
-                                       g2.drawString(getValueAsStringAt(li, co, kanjiMode), pos.x, pos.y);
+                                       g2.drawString(digit, pos.x, pos.y);
                                }
                        }
                }
@@ -426,9 +398,9 @@ public class SwingGrid extends JPanel implements Printable {
                g2.translate(-160, 140);
 
                paintGridBoard(g2);
-               boolean kanjiMode = UserPreferences.getInstance().getBoolean("kanjiMode", false);
-               paintGridNumbers(g2, kanjiMode);
-               paintPlayerNumbers(g2, kanjiMode);
+               int numbersMode = UserPreferences.getInstance().getInteger("numbersMode", Integer.valueOf(0)).intValue();
+               paintGridNumbers(g2, numbersMode);
+               paintPlayerNumbers(g2, numbersMode);
 
                return PAGE_EXISTS;
        }
index f9b9886..93d88a4 100644 (file)
@@ -53,11 +53,9 @@ public class SwingMultiGrid extends JPanel implements Printable {
        private SudokuGrid su4;
 
        SwingMultiGrid(SudokuGrid su1, SudokuGrid su2, SudokuGrid su3, SudokuGrid su4) {
-
-               setPreferredSize(new Dimension(columns[columns.length-1].getEnd()
-                               - columns[0].getStart() + offX * 2, rows[rows.length-1].getEnd()
-                               - rows[0].getStart() + offY * 2));
-
+        setPreferredSize(new Dimension(columns[columns.length - 1].getEnd()
+                                       - columns[0].getStart() + offX * 2 + 1,
+                                       rows[rows.length - 1].getEnd() - rows[0].getStart() + offY * 2 + 1));
                this.su1 = su1;
                this.su2 = su2;
                this.su3 = su3;
@@ -74,75 +72,49 @@ public class SwingMultiGrid extends JPanel implements Printable {
         * @return A Point giving the position where to draw the digit for cell (li,
         *         co)
         */
-       private Point getPosition(Graphics2D g2, int li, int co) {
-               if (!(0 <= li && li < 9 && 0 <= co && co < 9)) {
-                       throw new IllegalArgumentException();
-               }
+    private Point getPosition(Graphics2D g2, int li, int co, String digit) {
+        if (!(0 <= li && li < 9 && 0 <= co && co < 9)) {
+            throw new IllegalArgumentException();
+        }
 
-               FontMetrics fm = getFontMetrics(g2.getFont());
-               int h = fm.getHeight();
-               int w = fm.stringWidth("X");
+        FontMetrics fm = getFontMetrics(g2.getFont());
+        int h = fm.getHeight();
+        int w = fm.stringWidth(digit);
 
-               int x = columns[co].getStart() + CELL_SIZE / 2 - w / 2;
-               int y = rows[li].getStart() + CELL_SIZE / 2 + h / 4;
+        int x = columns[co].getStart() + (CELL_SIZE - w ) / 2;
+        int y = rows[li].getStart() + (CELL_SIZE + h / 2) / 2;
 
-               return new Point(x, y);
-       }
+        return new Point(x, y + 1);
+    }
 
-       private void paintGridNumbers(Graphics2D g2, SudokuGrid grid, boolean kanjiMode) {
+       private void paintGridNumbers(Graphics2D g2, SudokuGrid grid, int numbersMode) {
                g2.setColor(Color.BLACK);
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);
                // Font font = new Font("Serif", Font.BOLD, FONT_SIZE);
-               Font font = new Font("Serif", Font.BOLD, FONT_SIZE - (kanjiMode?4:0));
+               Font font = new Font("Serif", Font.BOLD, FONT_SIZE - (numbersMode==1?4:0));
                g2.setFont(font);
 
                for (int li = 0; li < 9; li++) {
                        for (int co = 0; co < 9; co++) {
-                               Point pos = getPosition(g2, li, co);
-                               g2.drawString(getValueAsStringAt(grid, li, co, kanjiMode), pos.x, pos.y);
+                           
+                String digit = getValueAsStringAt(grid, li, co, numbersMode);
+                Point pos = getPosition(g2, li, co, digit);
+                               g2.drawString(digit, pos.x, pos.y);
                        }
                }
        }
 
-       private String getValueAsStringAt(SudokuGrid grid, int li, int co, boolean kanjiMode) {
-               int value = grid.getValueAt(li, co);
-               String result = "";
-               if (kanjiMode) {
-                       switch (value) {
-                       case 1:
-                               result = "\u4e00";
-                               break;
-                       case 2:
-                               result = "\u4E8C";
-                               break;
-                       case 3:
-                               result = "\u4e09";
-                               break;
-                       case 4:
-                               result = "\u56DB";
-                               break;
-                       case 5:
-                               result = "\u4E94";
-                               break;
-                       case 6:
-                               result = "\u516D";
-                               break;
-                       case 7:
-                               result = "\u4E03";
-                               break;
-                       case 8:
-                               result = "\u516B";
-                               break;
-                       case 9:
-                               result = "\u4E5D";
-                               break;
-                       }
-               } else {
-                       result = (value == 0) ? "" : String.valueOf(value);
-               }
-               return result; 
-       }
+    private static String[] digits = { "", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+        "", "\u4e00", "\u4E8C", "\u4e09", "\u56DB", "\u4E94", "\u516D", "\u4E03", "\u516B", "\u4E5D",
+        "", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669",
+    };
+    
+    private String getValueAsStringAt(SudokuGrid grid, int li, int co, int numbersMode) {
+        int value = grid.getValueAt(li, co);
+        String result = digits[value + (10 * numbersMode)];
+        return result; 
+    }
        
        private void paintGridBoard(Graphics2D g2) {
                g2.setColor(Color.WHITE);
@@ -225,21 +197,21 @@ public class SwingMultiGrid extends JPanel implements Printable {
                /* Now we perform our rendering */
                g2.translate(-240, 140);
 
-               boolean kanjiMode = UserPreferences.getInstance().getBoolean("kanjiMode", false);
+               int numbersMode = UserPreferences.getInstance().getInteger("numbersMode", Integer.valueOf(0)).intValue();
                paintGridBoard(g2);
-               paintGridNumbers(g2, su1, kanjiMode);
+               paintGridNumbers(g2, su1, numbersMode);
 
                g2.translate(230, 0);
                paintGridBoard(g2);
-               paintGridNumbers(g2, su2, kanjiMode);
+               paintGridNumbers(g2, su2, numbersMode);
 
                g2.translate(-230, 250);
                paintGridBoard(g2);
-               paintGridNumbers(g2, su3, kanjiMode);
+               paintGridNumbers(g2, su3, numbersMode);
 
                g2.translate(230, 0);
                paintGridBoard(g2);
-               paintGridNumbers(g2, su4, kanjiMode);
+               paintGridNumbers(g2, su4, numbersMode);
 
                return PAGE_EXISTS;
        }