/** Updates the coordinates displayed on the GUI */
 public void updateC() {
   if (!canEdit) {
     jTextField6.setText("" + model.CornOriCoord(cube.c));
     jTextField5.setText("" + model.EdgeOriCoord(cube.e));
     jTextField4.setText("" + model.UDSliceCoord(cube));
     int flipUD = flip.FlipUDSliceCoord(cube);
     jTextField3.setText("" + (int) (flipUD / 16) + " " + (int) (flipUD % 16));
     jTextField2.setText(
         ""
             + prune.Phase1PruningTable[(int) (flipUD / 16)][
                 table.CornOriSym[model.CornOriCoord(cube.c)][flipUD % 16]]);
     jTextField11.setText("" + model.CornPermCoord(cube.c));
     jTextField10.setText("" + model.EdgePermCoord(cube.e));
     jTextField9.setText("" + model.UDSliceSortedCoord(cube));
     if (model.CornOriCoord(cube.c) == 0
         && model.EdgeOriCoord(cube.e) == 0
         && (int) (flipUD / 16) == 0) { // phase2
       jTextField12.setText("" + model.Phase2EdgePermCoord(cube));
       int CornPerm = perm.CornPermCoord(cube);
       jTextField8.setText("" + (int) (perm.CornPermCoord(cube) / 16) + " " + CornPerm % 16);
       jTextField7.setText(
           ""
               + prune.Phase2PruningTable[(int) (CornPerm / 16)][
                   table.P2EdgePermSym[model.Phase2EdgePermCoord(cube)][CornPerm % 16]]);
     }
     updateView();
   }
 }
 /** Creates new form RubikDisplay */
 public RubikDisplay2() {
   try {
     UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
   } catch (Exception e) {
     e.printStackTrace();
   }
   initComponents();
   File input, output;
   ObjectInputStream in;
   ObjectOutputStream out;
   model = null;
   nextMove = 0;
   moveList = null;
   long time1 = System.currentTimeMillis();
   // Initializes each structure by testing if it exists
   try {
     input = new File("model.dat");
     in = new ObjectInputStream(new FileInputStream(input));
     model = (RubikModel2) in.readObject();
     in.close();
     System.out.println("Model read from file");
   } catch (Exception e) {
     System.out.println("Error reading model from file");
     // e.printStackTrace();
   }
   // if unable to read from file, will recalculate
   if (model == null) {
     model = new RubikModel2();
     try {
       output = new File("model.dat");
       out = new ObjectOutputStream(new FileOutputStream(output));
       out.writeObject(model);
       out.close();
     } catch (Exception e) {
       System.out.println("Error writing model");
       e.printStackTrace();
     }
     System.out.println("Model created and saved");
   }
   long time2 = System.currentTimeMillis();
   flip = null;
   try {
     input = new File("flip.dat");
     in = new ObjectInputStream(new FileInputStream(input));
     flip = (FlipUDSlice) in.readObject();
     flip.setModel(model);
     in.close();
     System.out.println("FlipUDSlice read from file");
   } catch (Exception e) {
     System.out.println("Error reading FlipUDSlice from file");
     // e.printStackTrace();
   }
   if (flip == null) {
     flip = new FlipUDSlice(model);
     try {
       output = new File("flip.dat");
       out = new ObjectOutputStream(new FileOutputStream(output));
       out.writeObject(flip);
       out.close();
     } catch (Exception e) {
       System.out.println("Error writing FlipUDSlice");
       e.printStackTrace();
     }
     System.out.println("FlipUDSlice created and saved");
   }
   long time6 = System.currentTimeMillis();
   perm = null;
   try {
     input = new File("perm.dat");
     in = new ObjectInputStream(new FileInputStream(input));
     perm = (CornerPerm) in.readObject();
     perm.setModel(model);
     in.close();
     System.out.println("CornerPerm read from file");
   } catch (Exception e) {
     System.out.println("Error reading CornerPerm from file");
     // e.printStackTrace();
   }
   if (perm == null) {
     perm = new CornerPerm(model);
     try {
       output = new File("perm.dat");
       out = new ObjectOutputStream(new FileOutputStream(output));
       out.writeObject(perm);
       out.close();
     } catch (Exception e) {
       System.out.println("Error writing CornerPerm");
       e.printStackTrace();
     }
     System.out.println("CornerPerm created and saved");
   }
   long time3 = System.currentTimeMillis();
   table = null;
   try {
     input = new File("twist.dat");
     in = new ObjectInputStream(new FileInputStream(input));
     table = (TwistMoveTable) in.readObject();
     in.close();
     System.out.println("TwistMoveTable read from file");
   } catch (Exception e) {
     System.out.println("Error reading TwistMoveTable from file");
     // e.printStackTrace();
   }
   if (table == null) {
     table = new TwistMoveTable(model, flip, perm);
     try {
       output = new File("twist.dat");
       out = new ObjectOutputStream(new FileOutputStream(output));
       out.writeObject(table);
       out.close();
     } catch (Exception e) {
       System.out.println("Error writing TwistMoveTable");
       e.printStackTrace();
     }
     System.out.println("TwistMoveTable created and saved");
   }
   long time4 = System.currentTimeMillis();
   prune = null;
   try {
     input = new File("prune.dat");
     in = new ObjectInputStream(new FileInputStream(input));
     prune = (PruningTables) in.readObject();
     in.close();
     System.out.println("PruningTables read from file");
   } catch (Exception e) {
     System.out.println("Error reading PruningTables from file");
     // e.printStackTrace();
   }
   if (prune == null) {
     prune = new PruningTables(model, flip, table, perm);
     try {
       output = new File("prune.dat");
       out = new ObjectOutputStream(new FileOutputStream(output));
       out.writeObject(prune);
       out.close();
     } catch (Exception e) {
       System.out.println("Error writing PruningTables");
       e.printStackTrace();
     }
     System.out.println("PruningTables created and saved");
   }
   long time5 = System.currentTimeMillis();
   System.out.println("Model Initialization took " + (time2 - time1) + "ms");
   System.out.println("FlipUDSlice Initialization took " + (time6 - time2) + "ms");
   System.out.println("CornerPerm Initialization took " + (time3 - time6) + "ms");
   System.out.println("Table Initialization took " + (time4 - time3) + "ms");
   System.out.println("PruningTable Initialization took " + (time5 - time4) + "ms");
   this.setSize(800, 600);
   up = new JButton[3][3];
   down = new JButton[3][3];
   left = new JButton[3][3];
   right = new JButton[3][3];
   back = new JButton[3][3];
   front = new JButton[3][3];
   for (int i = 0; i < 3; i++) {
     for (int j = 0; j < 3; j++) {
       up[i][j] = new JButton();
       up[i][j].addActionListener(this);
       up[i][j].setPreferredSize(new Dimension(30, 30));
       this.getContentPane()
           .add(up[i][j], new AbsoluteConstraints(461 + 110 + 35 * i, 110 + 5 + 35 * j));
       down[i][j] = new JButton();
       down[i][j].addActionListener(this);
       down[i][j].setPreferredSize(new Dimension(30, 30));
       this.getContentPane()
           .add(down[i][j], new AbsoluteConstraints(461 + 110 + 35 * i, 110 + 215 + 35 * j));
       left[i][j] = new JButton();
       left[i][j].addActionListener(this);
       left[i][j].setPreferredSize(new Dimension(30, 30));
       this.getContentPane()
           .add(left[i][j], new AbsoluteConstraints(461 + 5 + 35 * i, 110 + 110 + 35 * j));
       right[i][j] = new JButton();
       right[i][j].addActionListener(this);
       right[i][j].setPreferredSize(new Dimension(30, 30));
       this.getContentPane()
           .add(right[i][j], new AbsoluteConstraints(461 + 215 + 35 * i, 110 + 110 + 35 * j));
       back[i][j] = new JButton();
       back[i][j].addActionListener(this);
       back[i][j].setPreferredSize(new Dimension(30, 30));
       this.getContentPane()
           .add(back[i][j], new AbsoluteConstraints(461 + 110 + 35 * i, 110 + 320 + 35 * j));
       front[i][j] = new JButton();
       front[i][j].addActionListener(this);
       front[i][j].setPreferredSize(new Dimension(30, 30));
       this.getContentPane()
           .add(front[i][j], new AbsoluteConstraints(461 + 110 + 35 * i, 110 + 110 + 35 * j));
     }
   }
   cube = new CubieCube(true);
   updateC();
 }