Project

General

Profile

Download (46.4 KB) Statistics
| Branch: | Revision:

sokoban / distorted-sokoban / src / main / java / org / distorted / sokoban / SokobanMenu.java @ 1f6d1786

1
package org.distorted.sokoban;
2

    
3
import android.graphics.Bitmap;
4
import android.graphics.BitmapFactory;
5
import android.graphics.Color;
6
import android.graphics.Paint;
7
import android.graphics.Canvas;
8
import android.graphics.Paint.Align;
9
import android.graphics.Paint.Style;
10
import android.graphics.drawable.NinePatchDrawable;
11
import android.graphics.Rect;
12

    
13
import android.content.Context;
14
import android.content.res.Resources;
15

    
16
import org.distorted.keyboard.StringBlock;
17
import org.distorted.keyboard.TouchKeyboard;
18

    
19
//import android.util.Log;
20

    
21
///////////////////////////////////////////////////////////////////////////////////////////////////
22

    
23
public final class SokobanMenu implements TouchKeyboard.VirtualKeyboardListener
24
  {  
25
  //private static final String TAG_MENU = "SokobanMenu";	
26
	
27
  private static final int SOFT_NOT = 0;
28
  private static final int SOFT_LEF = 1;
29
  private static final int SOFT_RIG = 2;
30
  private static final int SOFT_LEL = 3;
31
  private static final int SOFT_LER = 4;
32

    
33
  public static final int ACTION_NONE = 0;
34
  public static final int ACTION_SUBL = 1;
35
  public static final int ACTION_SUBR = 2;
36

    
37
  private static final int GAP=20;
38

    
39
  private static String strHelptxt, strEmail, strLevel, strNewr, strSubm, strMoves, strSeconds;
40
  private static String strSolved, strName, strOptions, strSolveNL, strSubmitNL, strFirst, strChoose;
41
  private static String strSubmitted, strSuccessfully, strOk, strBack, strExit, strYes, strNo, strRecords;
42
  private static String strDone, strSubmit, strSolve, strAbort, strDownloaded, strHelp, strFailed;
43
  private static String strFTS, strIAT, strTagain, strSubmitting, strNoper, strTun, strLeaderboard;
44
  private static String strNtaken, strCname, strDlevels, strDownloading, strCNL, strFTD;
45
  private static String strNewLevels, strNewLevel, strNoNewLevels, strDownloaded2;
46
  private static String strSolveIt, strYWL, strOTS, strUL, strIncorrect;
47
  private static String strPNTS, strOAES, strPA, strID, strNCF, strLISA, strNOCD, strNETN, strODS;
48
  
49
  private static SokobanCanvas mCanvas;
50

    
51
  private int scrWidth;
52
  private int scrHeight;
53
  public static int lFontH,mFontH,hFontH,sFontH;
54
  
55
  private static NinePatchDrawable mDialog, mDlgRed, mButtonClicked, mButtUnClicked;
56
  private Bitmap mRollBlack, mRollGray, mBackBlack, mBackGray, mMaskBackground=null;
57
  private Paint mPaint;
58
  
59
  private int menuItem = -1;
60
  private int dialogX,dialogY0,dialogY1,dialogY2,dialogY3,dialogM;
61
  private TouchKeyboard tkb = null;
62
  private static int nameChangeAction =ACTION_NONE;
63
  private StringBlock blockHelptext;
64

    
65
  private int softkeyState = SOFT_NOT;
66
  private int comeBackState=SokobanCanvas.STATE_MAIN;
67
  private int numDownloaded;
68
  private int upperSoftkeyState;
69
  private int createdLevelError;
70

    
71
  private String levelNumStr;
72
  private boolean fontSmall;
73
  private int maxStrLen;
74
  private static Resources res;
75
  private int mRollH, mRollW, mBackH, mBackW;
76
  private static boolean mEmailClicked;
77
  
78
///////////////////////////////////////////////////////////////////////////////////////////////////
79

    
80
  public SokobanMenu(Context context, SokobanCanvas c)
81
    {
82
    mCanvas  = c; 
83
    scrWidth = mCanvas.getScrWidth();
84
    scrHeight= mCanvas.getScrHeight();
85

    
86
    res = context.getResources();
87
    
88
    try 
89
      {
90
      mDialog         = (NinePatchDrawable)res.getDrawable(R.drawable.dialog);
91
      mDlgRed         = (NinePatchDrawable)res.getDrawable(R.drawable.dialog_clicked);
92
      mButtonClicked  = (NinePatchDrawable)res.getDrawable(R.drawable.btn_clicked);
93
      mButtUnClicked  = (NinePatchDrawable)res.getDrawable(R.drawable.btn_unclicked); 
94
      
95
      mBackBlack      = BitmapFactory.decodeResource(res, R.drawable.back_black);
96
      mBackGray       = BitmapFactory.decodeResource(res, R.drawable.back_gray);
97
      mRollBlack      = BitmapFactory.decodeResource(res, R.drawable.roll_black);
98
      mRollGray       = BitmapFactory.decodeResource(res, R.drawable.roll_gray);
99
      }
100
    catch( Exception ex ) {}
101

    
102
    mEmailClicked = false;
103
    
104
    mPaint = new Paint();
105
    mPaint.setAntiAlias(true);
106
    mPaint.setStyle(Style.FILL);
107
    
108
    mRollH = mRollBlack.getHeight()/2;
109
    mRollW = mRollBlack.getWidth()/2;
110
    mBackH = mBackBlack.getHeight()/2;
111
    mBackW = mBackBlack.getWidth()/2;
112
    
113
    if( mRollH > SokobanLevels.mGap/4 - 5 )
114
      {
115
      float f = ((float)(SokobanLevels.mGap/4 - 5))/mRollH;
116
    	
117
      mRollW = (int)(f*mRollW);
118
      mRollH = (int)(f*mRollH);
119
      mBackW = (int)(f*mBackW);
120
      mBackH = (int)(f*mBackH);
121
      
122
      mRollBlack = Bitmap.createScaledBitmap(mRollBlack, 2*mRollW, 2*mRollH, true);
123
      mRollGray  = Bitmap.createScaledBitmap(mRollGray , 2*mRollW, 2*mRollH, true);
124
      mBackBlack = Bitmap.createScaledBitmap(mBackBlack, 2*mBackW, 2*mBackH, true);
125
      mBackGray  = Bitmap.createScaledBitmap(mBackGray , 2*mBackW, 2*mBackH, true);
126
      }
127
    
128
    strEmail        = context.getString(R.string.questions)+" "+context.getString(R.string.email);
129
    strHelptxt      = context.getString(R.string.helptxt);
130
    strLevel        = context.getString(R.string.level)+" ";
131
    strNewr         = context.getString(R.string.newr);
132
    strSubm         = context.getString(R.string.subm);
133
    strMoves        = " "+context.getString(R.string.moves);
134
    strSeconds      = " "+context.getString(R.string.seconds );
135
    strSolved       = context.getString(R.string.solved);
136
    strName         = context.getString(R.string.app_name);
137
    strOptions      = context.getString(R.string.options);
138
    strSolveNL      = context.getString(R.string.solvenl);
139
    strSubmitNL     = context.getString(R.string.submitnl);
140
    strFirst        = context.getString(R.string.first);
141
    strChoose       = context.getString(R.string.choose);
142
    strSubmitted    = context.getString(R.string.submitted);
143
    strSuccessfully = context.getString(R.string.successfully);		
144
    strOk           = context.getString(R.string.ok);
145
    strBack         = context.getString(R.string.back);
146
    strYes          = context.getString(R.string.yes);
147
    strNo           = context.getString(R.string.no);
148
    strExit         = context.getString(R.string.exit);
149
    strDone         = context.getString(R.string.done);
150
    strSolve        = context.getString(R.string.solve);
151
    strSubmit       = context.getString(R.string.submit);
152
    strAbort        = context.getString(R.string.abort);
153
    strDownloaded   = context.getString(R.string.downloaded);
154
    strHelp         = context.getString(R.string.help);
155
    strRecords      = context.getString(R.string.records);
156
    strFTS          = context.getString(R.string.fts);
157
    strIAT          = context.getString(R.string.iat);
158
    strTagain       = context.getString(R.string.tagain);
159
    strNoper        = context.getString(R.string.noper);
160
    strSubmitting   = context.getString(R.string.submitting);
161
    strTun          = context.getString(R.string.tun);
162
    strLeaderboard  = context.getString(R.string.leaderboard);
163
    strFailed       = context.getString(R.string.failed);
164
    strDlevels      = context.getString(R.string.dlevels);
165
    strCname        = context.getString(R.string.cname);
166
    strNtaken       = context.getString(R.string.ntaken);
167
    strDownloading  = context.getString(R.string.downloading);
168
    strCNL          = context.getString(R.string.cnl);
169
    strFTD          = context.getString(R.string.ftd);
170
    strNewLevels    = context.getString(R.string.newlevels);
171
    strNewLevel     = context.getString(R.string.newlevel);
172
    strNoNewLevels  = context.getString(R.string.nonewlevels);
173
    strDownloaded2  = context.getString(R.string.downloaded2);
174
    strSolveIt      = context.getString(R.string.solveit);
175
    strYWL          = context.getString(R.string.ywl);
176
    strOTS          = context.getString(R.string.ots);
177
    strUL           = context.getString(R.string.ul);
178
    strIncorrect    = context.getString(R.string.incorrect);
179
    strPNTS         = context.getString(R.string.pnts);
180
    strOAES         = context.getString(R.string.oaes);
181
    strPA           = context.getString(R.string.pa);
182
    strID           = context.getString(R.string.id);
183
    strNCF          = context.getString(R.string.ncf);
184
    strLISA         = context.getString(R.string.lisa);
185
    strLISA         = context.getString(R.string.lisa);
186
    strNOCD         = context.getString(R.string.nocd);
187
    strNETN         = context.getString(R.string.netn);
188
    strODS          = context.getString(R.string.ods);
189
    
190
    setUpDialogSizeAndFonts();
191
    }  
192

    
193
///////////////////////////////////////////////////////////////////////////////////////////////////
194

    
195
  private void setUpDialogSizeAndFonts()
196
    {
197
	if( scrWidth<=240 )
198
	  {
199
	  lFontH = 32;
200
	  mFontH = 24;
201
	  hFontH = 20;
202
	  sFontH = 14;
203
	  dialogX = scrWidth-10;
204
	  }
205
    else if( scrWidth<=320 )
206
	  {
207
      lFontH = 38;
208
      mFontH = 30;
209
      hFontH = 24;
210
      sFontH = 18;
211
      dialogX = scrWidth-20;
212
      }
213
    else if( scrWidth<=360 )
214
      {
215
      lFontH = 42;
216
      mFontH = 32;
217
      hFontH = 28;
218
      sFontH = 20;
219
      dialogX = scrWidth-30;
220
      }
221
	else if( scrWidth<=480 )
222
	  {
223
      lFontH = 50;
224
      mFontH = 40;
225
      hFontH = 34;
226
      sFontH = 28;
227
      dialogX = scrWidth-50;
228
      }
229
	else
230
	  {
231
      lFontH = 70;
232
      mFontH = 50;
233
      hFontH = 40;
234
      sFontH = 30;
235
      dialogX = 480;
236
      }  
237
	
238
    dialogM = dialogX/16;
239
    dialogY0= 3*scrHeight/4;
240
    dialogY1= 4*mFontH;
241
    dialogY2= 4*mFontH+3*GAP + 60;
242
    dialogY3= 6*mFontH;
243
    
244
    if( dialogY0 > 400 ) dialogY0= 400;
245
    }
246

    
247
///////////////////////////////////////////////////////////////////////////////////////////////////
248

    
249
  public void enterPlayState(int levelNum)
250
    {
251
    levelNumStr=strLevel+(levelNum+1);
252
    mPaint.setTextSize(3*SokobanLevels.mGap/8);
253
    maxStrLen=scrWidth-30-(int)mPaint.measureText(levelNumStr);
254
    fontSmall=false;
255

    
256
    SokobanCanvas.setState(SokobanCanvas.STATE_PLAY);
257
    }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260

    
261
  public void updatePlayState()
262
    {
263
    String tmp= SokobanLevels.getCurrMoves()+"m "+SokobanLevels.getCurrTime()+"s"; 
264
    mPaint.setTextSize(3*SokobanLevels.mGap/8);
265
    if( mPaint.measureText(tmp)>maxStrLen ) fontSmall=true;
266
    }
267

    
268
///////////////////////////////////////////////////////////////////////////////////////////////////
269

    
270
  public void setScrDimensions(int w, int h)
271
    {
272
	if( scrWidth!=w || scrHeight!=h )
273
	  {
274
      scrWidth = w;
275
      scrHeight= h;
276
      setUpDialogSizeAndFonts();
277
	  }
278
    }
279

    
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281

    
282
  public void comeBackTo(int state)
283
    {
284
    comeBackState = state;
285
    }
286

    
287
///////////////////////////////////////////////////////////////////////////////////////////////////
288

    
289
  public static void setAction(int action)
290
    {
291
    nameChangeAction = action;
292
    }
293

    
294
///////////////////////////////////////////////////////////////////////////////////////////////////
295

    
296
  public static Resources getResources()
297
    {
298
	return res;  
299
    }
300
  
301
///////////////////////////////////////////////////////////////////////////////////////////////////
302

    
303
  public void setPointerState(int state,int x,int y,boolean pressed)
304
    {
305
    if( pressed )
306
      {
307
      softkeyState = retSoftkey(state,x,y);
308
      SokobanCanvas.setRepaint();
309

    
310
      if( state==SokobanCanvas.STATE_CREA && y<=SokobanLevels.mGap/2 )
311
        {
312
        upperSoftkeyState = 1+(x/(scrWidth/5));
313
        }
314
      }
315

    
316
    if( state==SokobanCanvas.STATE_MENU )
317
      {
318
      if( x>=(scrWidth-dialogX)/2 && x<=(scrWidth+dialogX)/2 )
319
        {
320
        menuItem = -1+(y+3*(mFontH+GAP)-(scrHeight+GAP)/2)/(mFontH+GAP);
321
        }
322
      }
323
    else if( state==SokobanCanvas.STATE_HELP )
324
      {
325
      int len=scrWidth-10;
326
      int gap=scrWidth/48;
327
      if(len>500) len=500;
328
      
329
      if( x>=(scrWidth-len)/2+gap && y>=(scrHeight-dialogY0)/2+gap && 
330
          x<=(scrWidth+len)/2-gap && y<=(scrHeight-dialogY0)/2+2*gap+sFontH+mFontH )
331
        {
332
    	mEmailClicked = true;  
333
        }
334
      }
335
    }
336

    
337
///////////////////////////////////////////////////////////////////////////////////////////////////
338

    
339
  public void tryPress(int state,int x,int y)
340
    {
341
    if( softkeyState!=SOFT_NOT ) 
342
      {
343
      if( y>= scrHeight-SokobanLevels.mGap/2 )
344
        {
345
        switch(softkeyState)
346
          {
347
          case SOFT_LEF: lefSoftkey(state); break;
348
          case SOFT_RIG: rigSoftkey(state); break;
349
          case SOFT_LEL: lelSoftkey(state); break;
350
          case SOFT_LER: lerSoftkey(state); break;
351
          }
352
        }
353

    
354
      softkeyState = SOFT_NOT;
355
      SokobanCanvas.setRepaint();
356
      }
357

    
358
    if( state==SokobanCanvas.STATE_CREA )
359
      {
360
      switch( upperSoftkeyState )
361
        {
362
        case 1: SokobanLevels.drop(SokobanLevel.WALL); break;
363
        case 2: SokobanLevels.drop(SokobanLevel.EMPT); break;
364
        case 3: SokobanLevels.drop(SokobanLevel.PACK); break;
365
        case 4: SokobanLevels.drop(SokobanLevel.DEST); break;
366
        case 5: SokobanLevels.resetCreated();          break;
367
        }
368
      upperSoftkeyState=0;
369
      }
370
    else if( state==SokobanCanvas.STATE_MENU )
371
      {
372
      SokobanRecords sr;
373

    
374
      switch(menuItem)
375
        {
376
        case 0: sr = mCanvas.getRecords();
377
                if( sr.isDirtyRecords() )
378
                  {
379
                  mCanvas.getRecords().downloadRecords();
380
                  SokobanCanvas.setState(SokobanCanvas.STATE_DOWN);
381
                  }
382
                else
383
                  SokobanCanvas.setState(SokobanCanvas.STATE_SUCD);
384
                break;
385
        case 1: SokobanCanvas.setState(SokobanCanvas.STATE_CREA); break;
386
        case 2: mCanvas.getRecords().downloadLevels();
387
                SokobanCanvas.setState(SokobanCanvas.STATE_DOWL);
388
                break;
389
        case 3: SokobanCanvas.setState(SokobanCanvas.STATE_HELP); break;
390
        }
391

    
392
      menuItem = -1;
393
      }
394
    else if( state==SokobanCanvas.STATE_HELP )
395
      {
396
      int len=scrWidth-10;
397
      int gap=scrWidth/48;
398
      if(len>500) len=500;
399
        
400
      if( x>=(scrWidth-len)/2+gap && y>=(scrHeight-dialogY0)/2+gap && mEmailClicked && 
401
          x<=(scrWidth+len)/2-gap && y<=(scrHeight-dialogY0)/2+gap+sFontH+mFontH )
402
        {
403
      	mCanvas.sendMail();  
404
        }	
405
      mEmailClicked = false;
406
      }
407
    }
408

    
409
///////////////////////////////////////////////////////////////////////////////////////////////////
410

    
411
  public void lefSoftkey(int state)
412
    {
413
    switch(state)
414
      {
415
      case SokobanCanvas.STATE_NEWR: if( mCanvas.getRecords().submitRecord(SokobanLevels.getCurrLevel()) )
416
                                       SokobanCanvas.setState(SokobanCanvas.STATE_SUBM);
417
                                     else
418
                                       {
419
                                       nameChangeAction = ACTION_SUBR;
420
                                       SokobanCanvas.setState(SokobanCanvas.STATE_NAME);
421
                                       }
422
                                     break;
423
      case SokobanCanvas.STATE_NAME:
424
      case SokobanCanvas.STATE_EXIS: changeName();
425
                                     SokobanCanvas.setState(SokobanCanvas.STATE_SUBM);
426
                                     break;
427
      case SokobanCanvas.STATE_MAIN: SokobanCanvas.setState(SokobanCanvas.STATE_MENU);
428
                                     break;
429
      case SokobanCanvas.STATE_CREA: createdLevelError = SokobanLevels.validate();
430
                                     SokobanCanvas.setState(SokobanCanvas.STATE_CRED);
431
                                     break;
432
      }
433
    }
434

    
435
///////////////////////////////////////////////////////////////////////////////////////////////////
436

    
437
  public void rigSoftkey(int state)
438
    {
439
    switch(state)
440
      {
441
      case SokobanCanvas.STATE_MAIN: mCanvas.getActivity().finish();
442
                                     break;
443
      case SokobanCanvas.STATE_DOWL:
444
      case SokobanCanvas.STATE_DOWN: mCanvas.getRecords().abortNetworkTransaction();
445
                                     SokobanCanvas.setState(SokobanCanvas.STATE_MENU);
446
                                     break;
447
      case SokobanCanvas.STATE_SUBM: mCanvas.getRecords().abortNetworkTransaction();
448
      case SokobanCanvas.STATE_FAIL:
449
      case SokobanCanvas.STATE_RECO:
450
      case SokobanCanvas.STATE_NEWR:
451
      case SokobanCanvas.STATE_TIME:
452
      case SokobanCanvas.STATE_PLAY: SokobanLevels.getInstance().rollback();
453
                                     SokobanLevels.getInstance().resetCurrTime();
454
                                     SokobanCanvas.setState(SokobanCanvas.STATE_MAIN);
455
                                     break;
456
      case SokobanCanvas.STATE_CRES: SokobanLevels.getInstance().rollbackCreated();
457
                                     SokobanCanvas.setState(SokobanCanvas.STATE_CREA);
458
                                     break;
459
      case SokobanCanvas.STATE_SECU: SokobanLevels.getInstance().rollback();
460
                                     SokobanLevels.getInstance().resetCurrTime();
461
                                     SokobanCanvas.setState(comeBackState);
462
                                     break;
463
      case SokobanCanvas.STATE_SUCE:
464
      case SokobanCanvas.STATE_MENU: SokobanCanvas.setState(SokobanCanvas.STATE_MAIN);
465
                                     break;
466
      case SokobanCanvas.STATE_FAID:
467
      case SokobanCanvas.STATE_SUCD:
468
      case SokobanCanvas.STATE_FAIE:
469
      case SokobanCanvas.STATE_CREA: SokobanCanvas.setState(SokobanCanvas.STATE_MENU);
470
                                     break;
471
      case SokobanCanvas.STATE_CRED: if( createdLevelError==0 )
472
                                       SokobanCanvas.setState(SokobanCanvas.STATE_CRES);
473
                                     else
474
                                       SokobanCanvas.setState(SokobanCanvas.STATE_CREA);
475
                                     break;
476
      case SokobanCanvas.STATE_SUBC: SokobanLevel c = SokobanLevels.getInstance().getCreated();
477
                                     if( mCanvas.getRecords().submitLevel(c.getCols(),c.encodeLevel()) )
478
                                       SokobanCanvas.setState(SokobanCanvas.STATE_SUBM);
479
                                     else
480
                                       {
481
                                       nameChangeAction = ACTION_SUBL;
482
                                       SokobanCanvas.setState(SokobanCanvas.STATE_NAME);
483
                                       }
484
                                     break;
485
      case SokobanCanvas.STATE_HELP: if( SokobanDatabase.getInstance().getNumRunnings()==0 )
486
                                       SokobanCanvas.setState(SokobanCanvas.STATE_MAIN);
487
                                     else
488
                                       SokobanCanvas.setState(SokobanCanvas.STATE_MENU);
489
                                     break;
490
      }
491
    }
492

    
493
///////////////////////////////////////////////////////////////////////////////////////////////////
494

    
495
  public void lelSoftkey(int state)
496
    {
497
    if( state==SokobanCanvas.STATE_PLAY )
498
      {
499
      SokobanLevels.getInstance().rollback();
500
      }
501
    else if( state==SokobanCanvas.STATE_CRES )
502
      {
503
      SokobanLevels.getInstance().rollbackCreated();
504
      }
505
    }
506

    
507
///////////////////////////////////////////////////////////////////////////////////////////////////
508

    
509
  public void lerSoftkey(int state)
510
    {
511
    if( state==SokobanCanvas.STATE_PLAY )
512
      {
513
      SokobanLevels.getInstance().withdraw();
514
      }
515
    else if( state==SokobanCanvas.STATE_CRES )
516
      {
517
      SokobanLevels.getInstance().withdrawCreated();
518
      }
519
    }
520

    
521
///////////////////////////////////////////////////////////////////////////////////////////////////
522

    
523
  public void downloadRecordsReady()
524
    {
525
	SokobanLevelBuffer.invalidateAllR();  
526
    SokobanCanvas.setState(SokobanCanvas.STATE_SUCD);
527
    SokobanCanvas.setRepaint();
528
    }
529

    
530
///////////////////////////////////////////////////////////////////////////////////////////////////
531

    
532
  public void downloadLevelsReady(int num)
533
    {
534
    numDownloaded = num;
535
    if( num>0 ) SokobanLevels.getInstance().scrollToEnd();
536
    SokobanCanvas.setState(SokobanCanvas.STATE_SUCE);
537
    SokobanCanvas.setRepaint();
538
    }
539

    
540
///////////////////////////////////////////////////////////////////////////////////////////////////
541

    
542
  public void render(int state, Canvas c)
543
    {  
544
    switch(state)
545
      {
546
      case SokobanCanvas.STATE_NEWR: renderNewR(c); break;
547
      case SokobanCanvas.STATE_TIME: renderTime(c); break;
548
      case SokobanCanvas.STATE_RECO: renderReco(c); break;
549
      case SokobanCanvas.STATE_NAME: renderName(c); break;
550
      case SokobanCanvas.STATE_FAIL: renderFail(c); break;
551
      case SokobanCanvas.STATE_EXIS: renderExis(c); break;
552
      case SokobanCanvas.STATE_SUBM: renderSubm(c); break;
553
      case SokobanCanvas.STATE_SECU: renderSecu(c); break;
554
      case SokobanCanvas.STATE_MENU: renderMenu(c); break;
555
      case SokobanCanvas.STATE_DOWN:
556
      case SokobanCanvas.STATE_DOWL: renderDown(c); break;
557
      case SokobanCanvas.STATE_HELP: renderHelp(c); break;
558
      case SokobanCanvas.STATE_FAID:
559
      case SokobanCanvas.STATE_FAIE: renderFaid(c); break;
560
      case SokobanCanvas.STATE_SUCE: renderSuce(c); break;
561
      case SokobanCanvas.STATE_CRED: renderCred(c); break;
562
      case SokobanCanvas.STATE_SUBC: renderSubc(c); break;
563
      }
564

    
565
    if( state!=SokobanCanvas.STATE_CREA &&
566
        state!=SokobanCanvas.STATE_CRED  ) renderUpperPane(state,c);
567
    else                                   renderCreatedPane(c);
568

    
569
    renderLowerPane(state,c); 
570
    renderSoftkeyCaptions(state,c);
571
    }
572

    
573
///////////////////////////////////////////////////////////////////////////////////////////////////
574
// private part
575

    
576
  private void renderNewR( Canvas c )
577
    {
578
    maskBackground(c);
579
    
580
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY3)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY3)/2, false,c );
581

    
582
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
583
    mPaint.setTextSize(mFontH);
584
    mPaint.setTextAlign(Align.CENTER);
585
    
586
    c.drawText(strNewr, scrWidth/2, scrHeight/2 - 3*mFontH/2, mPaint);
587
    c.drawText(strSubm, scrWidth/2, scrHeight/2 + 5*mFontH/2, mPaint);
588

    
589
    int seconds = SokobanLevels.getCurrTime();
590
    int moves   = SokobanLevels.getCurrMoves();
591

    
592
    mPaint.setFakeBoldText(true);
593

    
594
    c.drawText(moves+strMoves    , scrWidth/2, scrHeight/2       , mPaint);
595
    c.drawText(seconds+strSeconds, scrWidth/2, scrHeight/2+mFontH, mPaint);
596
    
597
    mPaint.setFakeBoldText(false);
598
    }
599

    
600
///////////////////////////////////////////////////////////////////////////////////////////////////
601

    
602
  private void renderTime(Canvas c)
603
    {
604
    maskBackground(c);
605

    
606
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
607

    
608
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
609
    mPaint.setTextSize(mFontH);
610
    mPaint.setTextAlign(Align.CENTER);
611
    
612
    c.drawText(strSolved, scrWidth/2, scrHeight/2 - mFontH/2 -2,mPaint);
613

    
614
    int seconds = SokobanLevels.getCurrTime();
615
    int moves   = SokobanLevels.getCurrMoves();
616

    
617
    mPaint.setFakeBoldText(true);
618

    
619
    c.drawText(moves+strMoves    , scrWidth/2, scrHeight/2+  mFontH/2 +2,mPaint);
620
    c.drawText(seconds+strSeconds, scrWidth/2, scrHeight/2+3*mFontH/2 +2,mPaint);      
621
    
622
    mPaint.setFakeBoldText(false);
623
    }
624

    
625
///////////////////////////////////////////////////////////////////////////////////////////////////
626

    
627
  private void renderName(Canvas c)
628
    {
629
    maskBackground(c);
630

    
631
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
632
    
633
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
634
    mPaint.setTextSize(mFontH);
635
    mPaint.setTextAlign(Align.CENTER);
636
    
637
    c.drawText(strFirst  , scrWidth/2, scrHeight/2         ,mPaint);
638
    c.drawText(strChoose , scrWidth/2, scrHeight/2 +mFontH ,mPaint);
639
    }
640

    
641
///////////////////////////////////////////////////////////////////////////////////////////////////
642

    
643
  private void renderReco(Canvas c)
644
    {
645
    maskBackground(c);
646

    
647
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
648
    
649
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
650
    mPaint.setTextSize(mFontH);
651
    mPaint.setTextAlign(Align.CENTER);
652
    
653
    c.drawText(strSubmitted   , scrWidth/2, scrHeight/2         ,mPaint);
654
    c.drawText(strSuccessfully, scrWidth/2, scrHeight/2 +mFontH ,mPaint);
655
    }
656

    
657
///////////////////////////////////////////////////////////////////////////////////////////////////
658

    
659
  private void renderFail(Canvas c)
660
    {
661
    maskBackground(c);
662

    
663
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
664
    
665
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
666
    mPaint.setTextSize(mFontH);
667
    mPaint.setTextAlign(Align.CENTER);
668
    
669
    c.drawText(strFTS, scrWidth/2, scrHeight/2 + mFontH/2, mPaint);
670
    }
671

    
672
///////////////////////////////////////////////////////////////////////////////////////////////////
673

    
674
  private void renderExis(Canvas c)
675
    {
676
    maskBackground(c);
677

    
678
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
679
    
680
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
681
    mPaint.setTextSize(mFontH);
682
    mPaint.setTextAlign(Align.CENTER);
683

    
684
    SokobanDatabase db = SokobanDatabase.getInstance();
685

    
686
    c.drawText( "'"+db.getName()+"'", scrWidth/2, scrHeight/2 -   mFontH/2, mPaint);
687
    c.drawText( strIAT              , scrWidth/2, scrHeight/2 +   mFontH/2, mPaint);
688
    c.drawText( strTagain           , scrWidth/2, scrHeight/2 + 3*mFontH/2, mPaint);
689
    }
690

    
691
///////////////////////////////////////////////////////////////////////////////////////////////////
692

    
693
  private void renderSubm(Canvas c)
694
    {
695
    maskBackground(c);
696

    
697
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
698
    
699
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
700
    mPaint.setTextSize(mFontH);
701
    mPaint.setTextAlign(Align.CENTER);
702
    
703
    c.drawText(strSubmitting+"...", scrWidth/2, scrHeight/2 + mFontH/2, mPaint);
704
    }
705

    
706
///////////////////////////////////////////////////////////////////////////////////////////////////
707

    
708
  private void renderSecu(Canvas c)
709
    {
710
    maskBackground(c);
711

    
712
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
713
    
714
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
715
    mPaint.setTextSize(mFontH);
716
    mPaint.setTextAlign(Align.CENTER);
717
    
718
    c.drawText(strNoper, scrWidth/2, scrHeight/2         , mPaint);
719
    c.drawText(strTun  , scrWidth/2, scrHeight/2 + mFontH, mPaint);
720
    }
721

    
722
///////////////////////////////////////////////////////////////////////////////////////////////////
723

    
724
  private void renderMenu(Canvas c)
725
    {
726
	int h = mFontH+GAP;  
727
	int h2= scrHeight/2 -h/2 +mFontH/3;
728
	
729
    maskBackground(c);
730

    
731
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY2)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY2)/2, false,c );
732
    
733
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
734
    mPaint.setTextSize(mFontH);
735
    mPaint.setTextAlign(Align.CENTER);
736

    
737
    if( menuItem>=0 && menuItem<=3 )
738
      {
739
      drawHighlight( (scrWidth-dialogX)/2+dialogM,scrHeight/2+(menuItem-2)*h,(scrWidth+dialogX)/2-dialogM, scrHeight/2+(menuItem-1)*h, true, c);
740
      }
741
    
742
    c.drawText(strLeaderboard, scrWidth/2, h2-  h, mPaint);
743
    c.drawText(strCNL        , scrWidth/2, h2    , mPaint);
744
    c.drawText(strDlevels    , scrWidth/2, h2+  h, mPaint);
745
    c.drawText(strHelp       , scrWidth/2, h2+2*h, mPaint);
746
    }
747

    
748
///////////////////////////////////////////////////////////////////////////////////////////////////
749

    
750
  private void renderDown(Canvas c)
751
    {
752
    maskBackground(c);
753

    
754
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
755
    
756
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
757
    mPaint.setTextSize(mFontH);
758
    mPaint.setTextAlign(Align.CENTER);
759
    
760
    c.drawText( strDownloading  , scrWidth/2, (scrHeight+mFontH)/2,  mPaint);
761
    }
762

    
763
///////////////////////////////////////////////////////////////////////////////////////////////////
764

    
765
  private void renderHelp(Canvas c)
766
    {
767
    maskBackground(c);
768
    int len = scrWidth-10;
769
    int gap = scrWidth/48;
770

    
771
    if( len>500 ) len=500;
772
    
773
    drawDialog( (scrWidth-len)/2,(scrHeight-dialogY0)/2, (scrWidth+len)/2, (scrHeight+dialogY0)/2, false,c );
774
    
775
    drawHighlight((scrWidth-len)/2+gap,(scrHeight-dialogY0)/2+gap, (scrWidth+len)/2-gap, (scrHeight-dialogY0)/2+2*gap+sFontH+mFontH, mEmailClicked,c);
776
    
777
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
778
    mPaint.setTextSize(mFontH);
779
    mPaint.setTextAlign(Align.CENTER);
780
    
781
    c.drawText( strName+" v."+SokobanCanvas.mVersionStr, scrWidth/2, (scrHeight-dialogY0)/2+gap+mFontH, mPaint);
782
    mPaint.setTextSize(sFontH);
783
    c.drawText( strEmail, scrWidth/2, (scrHeight-dialogY0)/2+gap+mFontH+sFontH, mPaint);
784

    
785
    if( blockHelptext==null )
786
      {
787
      int helpHeight  = dialogY0-3*gap-mFontH-sFontH;
788
      blockHelptext   = new StringBlock( strHelptxt, helpHeight, len-2*gap);
789
      }
790
    blockHelptext.draw(c,(scrWidth-len)/2+gap,(scrHeight-dialogY0)/2+mFontH+sFontH+2*gap, SokobanCanvas.COLOR_BLACK);
791
    }
792

    
793
///////////////////////////////////////////////////////////////////////////////////////////////////
794

    
795
  private void renderFaid(Canvas c)
796
    {
797
    maskBackground(c);
798

    
799
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
800
    
801
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
802
    mPaint.setTextSize(mFontH);
803
    mPaint.setTextAlign(Align.CENTER);
804
    
805
    c.drawText( strFTD, scrWidth/2, (scrHeight+mFontH)/2, mPaint);
806
    }
807

    
808
///////////////////////////////////////////////////////////////////////////////////////////////////
809

    
810
  private void renderSuce(Canvas c)
811
    {
812
    maskBackground(c);
813

    
814
    drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY1)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY1)/2, false,c );
815
    
816
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
817
    mPaint.setTextSize(mFontH);
818
    mPaint.setTextAlign(Align.CENTER);
819

    
820
    if( numDownloaded>1 )
821
      {
822
      c.drawText(strDownloaded                 , scrWidth/2, scrHeight/2       , mPaint);
823
      c.drawText(numDownloaded+" "+strNewLevels, scrWidth/2, scrHeight/2+mFontH, mPaint);
824
      }
825
    else if( numDownloaded==1 )
826
      {
827
      c.drawText(strDownloaded  , scrWidth/2, scrHeight/2        , mPaint);
828
      c.drawText(strNewLevel  , scrWidth/2, scrHeight/2 +mFontH, mPaint);
829
      }
830
    else
831
      {
832
      c.drawText(strNoNewLevels, scrWidth/2, scrHeight/2        , mPaint);
833
      c.drawText(strDownloaded2, scrWidth/2, scrHeight/2 +mFontH, mPaint);
834
      }
835
    }
836

    
837

    
838
///////////////////////////////////////////////////////////////////////////////////////////////////
839

    
840
  private void renderSubc(Canvas c)
841
    {
842
    maskBackground(c);
843

    
844
    
845
    }
846

    
847
///////////////////////////////////////////////////////////////////////////////////////////////////
848

    
849
  private void renderCred(Canvas c)
850
    {
851
    maskBackground(c);
852

    
853
    if( createdLevelError==0 )
854
      {
855
      drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY3)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY3)/2, false,c );
856
      
857
      mPaint.setColor(SokobanCanvas.COLOR_BLACK);
858
      mPaint.setTextSize(mFontH);
859
      mPaint.setTextAlign(Align.CENTER);
860
      
861
      c.drawText(strSolveIt, scrWidth/2, scrHeight/2- 2*mFontH  +SokobanLevels.mGapO, mPaint );
862
      c.drawText(strYWL    , scrWidth/2, scrHeight/2+   mFontH/2-SokobanLevels.mGapO, mPaint );
863
      c.drawText(strOTS    , scrWidth/2, scrHeight/2+ 3*mFontH/2-SokobanLevels.mGapO, mPaint );
864
      c.drawText(strUL     , scrWidth/2, scrHeight/2+ 5*mFontH/2-SokobanLevels.mGapO, mPaint );
865
      }
866
    else
867
      {
868
      drawDialog( (scrWidth-dialogX)/2,(scrHeight-dialogY3)/2, (scrWidth+dialogX)/2, (scrHeight+dialogY3)/2, false,c );
869
      
870
      mPaint.setColor(SokobanCanvas.COLOR_BLACK);
871
      mPaint.setTextSize(mFontH);
872
      mPaint.setTextAlign(Align.CENTER);
873
      
874
      c.drawText(strIncorrect, scrWidth/2, (scrHeight-dialogY3+3*mFontH)/2, mPaint);
875

    
876
      mPaint.setTextSize(hFontH);
877

    
878
      switch( createdLevelError )
879
        {
880
        case -1:
881
        case -2: c.drawText(strPNTS  , scrWidth/2, scrHeight/2+  mFontH/2, mPaint );
882
                 c.drawText(strOAES  , scrWidth/2, scrHeight/2+3*mFontH/2, mPaint );
883
                 break;
884
        case -3: c.drawText(strPA    , scrWidth/2, scrHeight/2+  mFontH/2, mPaint );
885
                 c.drawText(strID    , scrWidth/2, scrHeight/2+3*mFontH/2, mPaint );
886
                 break;
887
        case -4: c.drawText(strNCF   , scrWidth/2, scrHeight/2+  mFontH  , mPaint );
888
                 break;
889
        case -5: c.drawText(strLISA  , scrWidth/2, scrHeight/2+  mFontH  , mPaint );
890
                 break;
891
        default: c.drawText(strNOCD  , scrWidth/2, scrHeight/2           , mPaint );
892
                 c.drawText(strNETN  , scrWidth/2, scrHeight/2+  mFontH  , mPaint );
893
                 c.drawText(strODS   , scrWidth/2, scrHeight/2+2*mFontH  , mPaint );
894
                 break;
895
        }
896
      }
897
    }
898

    
899
///////////////////////////////////////////////////////////////////////////////////////////////////
900

    
901
  private void maskBackground(Canvas c)
902
    {
903
    if( mMaskBackground==null )
904
      {
905
      try
906
        {
907
        mMaskBackground = BitmapFactory.decodeResource(res, R.drawable.mask);
908
        }
909
      catch(Exception ex) { return; }
910
      }
911
    if( mMaskBackground!=null )
912
      {
913
      int mh = mMaskBackground.getHeight();
914
      int mw = mMaskBackground.getWidth();
915

    
916
      int h = (scrHeight-1)/mh;
917
      int w = (scrWidth -1)/mw;
918

    
919
      for(int i=0; i<=h; i++)
920
        for(int j=0; j<=w; j++ )
921
          c.drawBitmap(mMaskBackground, j*mw, i*mh, null);
922
      }
923
    }
924

    
925
///////////////////////////////////////////////////////////////////////////////////////////////////
926

    
927
  private int retSoftkey(int state, int x,int y)
928
    {
929
    if ( y>=scrHeight-SokobanLevels.mGap/2 )
930
      {
931
      if( x>scrWidth/2 )                     return SOFT_RIG;
932
      if( state!=SokobanCanvas.STATE_PLAY &&
933
          state!=SokobanCanvas.STATE_CRES  ) return SOFT_LEF;
934
      
935
      return x>scrWidth/4 ? SOFT_LER:SOFT_LEL;
936
      }
937

    
938
    return SOFT_NOT;
939
    }
940

    
941
///////////////////////////////////////////////////////////////////////////////////////////////////
942

    
943
  private void renderUpperPane(int state, Canvas c)
944
    {
945
    drawDialog(0,0,scrWidth, SokobanLevels.mGap/2, false, c);
946

    
947
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
948
    mPaint.setTextSize(3*SokobanLevels.mGap/8);
949
    mPaint.setTextAlign(Align.CENTER);
950

    
951
    int hei = 3*SokobanLevels.mGap/8;
952

    
953
    switch(state)
954
      {
955
      case SokobanCanvas.STATE_MAIN: c.drawText(strName    , scrWidth/2, hei, mPaint);
956
                                     break;
957
      case SokobanCanvas.STATE_MENU: c.drawText(strOptions , scrWidth/2, hei, mPaint);
958
                                     break;
959
      case SokobanCanvas.STATE_PLAY: mPaint.setTextAlign(Align.LEFT);
960
    	                             c.drawText(levelNumStr, 12,hei,mPaint );
961
                                     if( fontSmall )
962
                                       {
963
                                       mPaint.setTextSize(SokobanLevels.mGap/4);
964
                                       hei = SokobanLevels.mGap/3;
965
                                       }
966
                                     mPaint.setTextAlign(Align.RIGHT);
967
                                     c.drawText(SokobanLevels.getCurrMoves()+"m "+SokobanLevels.getCurrTime()+"s", scrWidth-12,hei, mPaint);
968
                                     break;
969
      case SokobanCanvas.STATE_CRES: c.drawText(strSolveNL , scrWidth/2, hei, mPaint);
970
                                     break;
971
      case SokobanCanvas.STATE_SUBC: c.drawText(strSubmitNL, scrWidth/2, hei, mPaint);
972
                                     break;
973
      case SokobanCanvas.STATE_NEWR:
974
      case SokobanCanvas.STATE_TIME: c.drawText(strSolved     , scrWidth/2, hei, mPaint);
975
                                     break;
976
      case SokobanCanvas.STATE_RECO: c.drawText(strSubmitted  , scrWidth/2, hei, mPaint);
977
                                     break;
978
      case SokobanCanvas.STATE_NAME: c.drawText(strCname      , scrWidth/2, hei, mPaint);
979
                                     break;
980
      case SokobanCanvas.STATE_FAID:
981
      case SokobanCanvas.STATE_FAIE:
982
      case SokobanCanvas.STATE_FAIL: c.drawText(strFailed     , scrWidth/2, hei, mPaint);
983
                                     break;
984
      case SokobanCanvas.STATE_EXIS: c.drawText(strNtaken     , scrWidth/2, hei, mPaint);
985
                                     break;
986
      case SokobanCanvas.STATE_SUBM: c.drawText(strSubmitting , scrWidth/2, hei, mPaint);
987
                                     break;
988
      case SokobanCanvas.STATE_SECU: c.drawText(strNoper      , scrWidth/2, hei, mPaint);
989
                                     break;
990
      case SokobanCanvas.STATE_DOWN: c.drawText(strLeaderboard, scrWidth/2, hei, mPaint);
991
                                     break;
992
      case SokobanCanvas.STATE_DOWL: c.drawText(strDlevels    , scrWidth/2, hei, mPaint);
993
                                     break;
994
      case SokobanCanvas.STATE_HELP: c.drawText(strHelp       , scrWidth/2, hei, mPaint);
995
                                     break;
996
      case SokobanCanvas.STATE_SUCD: c.drawText(strRecords    , scrWidth/2, hei, mPaint);
997
                                     break;
998
      case SokobanCanvas.STATE_SUCE: c.drawText(strDownloaded , scrWidth/2, hei, mPaint);
999
                                     break;
1000
      }
1001
    }
1002

    
1003
///////////////////////////////////////////////////////////////////////////////////////////////////
1004

    
1005
  private void renderCreatedPane(Canvas c)
1006
    {
1007
    int len = scrWidth/5;
1008
    int l2 = SokobanLevels.bCell1/2 - SokobanLevels.bMargin;
1009
    int h2 = SokobanLevels.mGap/4- l2;
1010
    int h  = SokobanLevels.packBig1.getHeight();
1011
    int h1 = (int)(0.32f*SokobanLevels.mGap);
1012
    	
1013
    drawHighlight(0*len, 0,   len, SokobanLevels.mGap/2, upperSoftkeyState==1, c);
1014
    drawHighlight(1*len, 0, 2*len, SokobanLevels.mGap/2, upperSoftkeyState==2, c);
1015
    drawHighlight(2*len, 0, 3*len, SokobanLevels.mGap/2, upperSoftkeyState==3, c);
1016
    drawHighlight(3*len, 0, 4*len, SokobanLevels.mGap/2, upperSoftkeyState==4, c);
1017
    drawHighlight(4*len, 0, 5*len, SokobanLevels.mGap/2, upperSoftkeyState==5, c);
1018

    
1019
    mPaint.setColor(SokobanCanvas.COLOR_WHITE);
1020
    
1021
    if( h1 >= h )
1022
      {
1023
      c.drawBitmap(SokobanLevels.playBig1,    len/2-l2, h2, mPaint);
1024
      c.drawRect(3*len/2- l2, h2, 3*len/2+l2, h2+2*l2, mPaint);
1025
      c.drawBitmap(SokobanLevels.packBig1, 5*len/2- l2, h2, mPaint);
1026
      c.drawBitmap(SokobanLevels.destBig1, 7*len/2- l2, h2, mPaint);
1027
      }
1028
    else
1029
      {
1030
      Rect src = new Rect();
1031
      Rect dst = new Rect();
1032
      
1033
      int off= (h-h1)/2;
1034
      
1035
      src.top    = off;
1036
      src.left   = off;
1037
      src.bottom = h-off;
1038
      src.right  = h-off;
1039

    
1040
      dst.top    = SokobanLevels.mGap/4 - h1/2;
1041
      dst.bottom = SokobanLevels.mGap/4 + h1/2;
1042
      
1043
      dst.left   = len/2 - h1/2;
1044
      dst.right  = len/2 + h1/2;
1045
      c.drawBitmap(SokobanLevels.playBig1, src, dst, mPaint);
1046
      
1047
      c.drawRect(3*len/2- h1/2, dst.top, 3*len/2+h1/2, dst.bottom, mPaint);
1048
      
1049
      dst.left   = 5*len/2 - h1/2;
1050
      dst.right  = 5*len/2 + h1/2;
1051
      c.drawBitmap(SokobanLevels.packBig1, src, dst, mPaint);
1052
      
1053
      dst.left   = 7*len/2 - h1/2;
1054
      dst.right  = 7*len/2 + h1/2;
1055
      c.drawBitmap(SokobanLevels.destBig1, src, dst, mPaint);
1056
      }
1057
    
1058
    c.drawBitmap(mRollBlack, 9*len/2- mRollW, SokobanLevels.mGap/4-mRollH, mPaint);
1059
    }
1060

    
1061
///////////////////////////////////////////////////////////////////////////////////////////////////
1062

    
1063
  private void renderLowerPane(int state, Canvas c)
1064
    {
1065
    boolean leftFocused = false;
1066
    boolean rightFocused= false;
1067
    boolean lelFocused  = false;
1068
    boolean lerFocused  = false;
1069

    
1070
    if( softkeyState==SOFT_RIG )
1071
      {
1072
      if( state==SokobanCanvas.STATE_MAIN ||
1073
          state==SokobanCanvas.STATE_PLAY ||
1074
          state==SokobanCanvas.STATE_FAIL ||
1075
          state==SokobanCanvas.STATE_RECO ||
1076
          state==SokobanCanvas.STATE_SECU ||
1077
          state==SokobanCanvas.STATE_MENU ||
1078
          state==SokobanCanvas.STATE_NEWR ||
1079
          state==SokobanCanvas.STATE_SUBM ||
1080
          state==SokobanCanvas.STATE_DOWN ||
1081
          state==SokobanCanvas.STATE_CREA ||
1082
          state==SokobanCanvas.STATE_CRED ||
1083
          state==SokobanCanvas.STATE_CRES ||
1084
          state==SokobanCanvas.STATE_SUBC ||
1085
          state==SokobanCanvas.STATE_DOWL ||
1086
          state==SokobanCanvas.STATE_HELP ||
1087
          state==SokobanCanvas.STATE_SUCD ||
1088
          state==SokobanCanvas.STATE_SUCE ||
1089
          state==SokobanCanvas.STATE_FAID ||
1090
          state==SokobanCanvas.STATE_FAIE ||
1091
          state==SokobanCanvas.STATE_TIME  ) rightFocused = true;
1092
      }
1093
    else if ( softkeyState==SOFT_LEF )
1094
      {
1095
      if( state==SokobanCanvas.STATE_MAIN ||
1096
          state==SokobanCanvas.STATE_NEWR ||
1097
          state==SokobanCanvas.STATE_EXIS ||
1098
          state==SokobanCanvas.STATE_CREA ||
1099
          state==SokobanCanvas.STATE_NAME  ) leftFocused  = true;
1100
      }
1101
    else if ( softkeyState==SOFT_LEL )
1102
      {
1103
      if( state==SokobanCanvas.STATE_PLAY && SokobanLevels.getInstance().canWithdraw()       ==true ) lelFocused=true;
1104
      if( state==SokobanCanvas.STATE_CRES && SokobanLevels.getInstance().canWithdrawCreated()==true ) lelFocused=true;
1105
      }
1106
    else if ( softkeyState==SOFT_LER )
1107
      {
1108
      if( state==SokobanCanvas.STATE_PLAY && SokobanLevels.getInstance().canWithdraw()       ==true ) lerFocused=true;
1109
      if( state==SokobanCanvas.STATE_CRES && SokobanLevels.getInstance().canWithdrawCreated()==true ) lerFocused=true;
1110
      }
1111

    
1112
    if( state!=SokobanCanvas.STATE_PLAY && state!=SokobanCanvas.STATE_CRES )
1113
      {
1114
      drawHighlight(         0, scrHeight-SokobanLevels.mGap/2, scrWidth/2, scrHeight, leftFocused, c);
1115
      }
1116
    else
1117
      {
1118
      mPaint.setColor(0xff000000);
1119
      mPaint.setStyle(Style.FILL);
1120
      c.drawRect(scrWidth/4-5, scrHeight-10, scrWidth/4+5, scrHeight, mPaint);
1121
      drawHighlight(         0, scrHeight-SokobanLevels.mGap/2, scrWidth/4, scrHeight, lelFocused, c);
1122
      drawHighlight(scrWidth/4, scrHeight-SokobanLevels.mGap/2, scrWidth/2, scrHeight, lerFocused, c);
1123
      }
1124

    
1125
    drawHighlight(scrWidth/2, scrHeight-SokobanLevels.mGap/2, scrWidth, scrHeight, rightFocused, c);
1126
    }
1127

    
1128
///////////////////////////////////////////////////////////////////////////////////////////////////
1129

    
1130
  private void renderSoftkeyCaptions(int state, Canvas c)
1131
    {
1132
	mPaint.setColor(SokobanCanvas.COLOR_BLACK);
1133
    mPaint.setTextSize(3*SokobanLevels.mGap/8);
1134
    mPaint.setTextAlign(Align.CENTER);
1135
      
1136
    String tmp="";
1137
    int hei = scrHeight-SokobanLevels.mGap/8;
1138

    
1139
    switch(state)
1140
      {
1141
      case SokobanCanvas.STATE_DOWN:
1142
      case SokobanCanvas.STATE_DOWL:
1143
      case SokobanCanvas.STATE_SUBM: tmp= strAbort; break;
1144
      case SokobanCanvas.STATE_PLAY:
1145
      case SokobanCanvas.STATE_TIME:
1146
      case SokobanCanvas.STATE_FAIL:
1147
      case SokobanCanvas.STATE_SECU:
1148
      case SokobanCanvas.STATE_CREA:
1149
      case SokobanCanvas.STATE_HELP:
1150
      case SokobanCanvas.STATE_RECO:
1151
      case SokobanCanvas.STATE_FAID:
1152
      case SokobanCanvas.STATE_FAIE:
1153
      case SokobanCanvas.STATE_SUCD:
1154
      case SokobanCanvas.STATE_CRES:
1155
      case SokobanCanvas.STATE_MENU: tmp= strBack ; break;
1156
      case SokobanCanvas.STATE_MAIN: tmp= strExit ; break;
1157
      case SokobanCanvas.STATE_SUCE: tmp= strOk   ; break;
1158
      case SokobanCanvas.STATE_CRED: tmp= (createdLevelError==0 ? strSolve:strBack); break;
1159
      case SokobanCanvas.STATE_SUBC: tmp= strSubmit; break;
1160
      case SokobanCanvas.STATE_NEWR: tmp= strNo    ; break;
1161
      }
1162
    c.drawText( tmp,3*scrWidth/4,hei, mPaint);
1163
    tmp ="";
1164

    
1165
    switch(state)
1166
      {
1167
      case SokobanCanvas.STATE_CREA: tmp= strDone    ; break;
1168
      case SokobanCanvas.STATE_EXIS:
1169
      case SokobanCanvas.STATE_NAME: tmp= strOk      ; break;
1170
      case SokobanCanvas.STATE_MAIN: tmp= strOptions ; break;
1171
      case SokobanCanvas.STATE_NEWR: tmp= strYes     ; break;
1172
      case SokobanCanvas.STATE_CRES: boolean isBlack1 = SokobanLevels.getInstance().canWithdrawCreated();
1173
                                     c.drawBitmap(isBlack1?mRollBlack:mRollGray,  scrWidth/8-mRollW, scrHeight-SokobanLevels.mGap/4-mRollH, mPaint);
1174
                                     c.drawBitmap(isBlack1?mBackBlack:mBackGray,3*scrWidth/8-mBackW, scrHeight-SokobanLevels.mGap/4-mBackH, mPaint);
1175
                                     break;
1176
      case SokobanCanvas.STATE_PLAY: boolean isBlack2 = SokobanLevels.getInstance().canWithdraw();
1177
                                     c.drawBitmap(isBlack2?mRollBlack:mRollGray,  scrWidth/8-mRollW, scrHeight-SokobanLevels.mGap/4-mRollH, mPaint);
1178
                                     c.drawBitmap(isBlack2?mBackBlack:mBackGray,3*scrWidth/8-mBackW, scrHeight-SokobanLevels.mGap/4-mBackH, mPaint);
1179
                                     break;
1180
      }
1181
    c.drawText(tmp ,scrWidth/4, hei, mPaint );
1182
    }
1183

    
1184
///////////////////////////////////////////////////////////////////////////////////////////////////
1185

    
1186
  public static void drawDialog(int x1, int y1, int x2, int y2, boolean clicked, Canvas c)
1187
    {
1188
	if( clicked )
1189
	  {
1190
	  mDlgRed.setBounds(x1, y1, x2, y2);
1191
	  mDlgRed.draw(c);
1192
	  }
1193
	else
1194
	  {
1195
	  mDialog.setBounds(x1, y1, x2, y2);
1196
	  mDialog.draw(c);	
1197
	  }
1198
    }
1199

    
1200
///////////////////////////////////////////////////////////////////////////////////////////////////
1201

    
1202
  private void drawHighlight(int x1, int y1, int x2, int y2, boolean clicked, Canvas c)
1203
    {
1204
	if( clicked )
1205
	  {
1206
	  mButtonClicked.setBounds(x1, y1, x2, y2);
1207
	  mButtonClicked.draw(c);
1208
	  }
1209
	else
1210
	  {
1211
	  mButtUnClicked.setBounds(x1, y1, x2, y2);
1212
	  mButtUnClicked.draw(c);	
1213
	  }
1214
    }
1215
  
1216
///////////////////////////////////////////////////////////////////////////////////////////////////
1217

    
1218
  private void changeName()
1219
    {
1220
	if( tkb==null )
1221
	  {
1222
	  tkb = new TouchKeyboard( mCanvas.getActivity().getApplicationContext(), scrWidth, scrHeight);
1223
	  tkb.setTextFieldBkgColor(0xFFE0DBCA);
1224
	  tkb.setTextFieldBorderColor(0xFF040477);
1225
	  tkb.setTextFieldFontColor(0xFF0033CC);
1226
	  tkb.setBackgroundColor(Color.BLACK);
1227
	  tkb.setVirtualKeyboardListener(this);
1228
	  tkb.resetKeyBoard();
1229
	  tkb.setMaxSize(10);
1230
	  tkb.setMinSize(1);
1231
	  }
1232

    
1233

    
1234

    
1235
	tkb.setText(SokobanDatabase.getInstance().getName());
1236
	mCanvas.getActivity().setContentView(tkb);
1237
    }
1238

    
1239
///////////////////////////////////////////////////////////////////////////////////////////////////
1240

    
1241
  public void okPressed(String text)
1242
    { 
1243
    SokobanDatabase.getInstance().setName(text);
1244
    SokobanLevels.getInstance().updateMyRecords(text);
1245
    mCanvas.getActivity().setContentView(mCanvas);
1246
    SokobanCanvas.setRepaint();
1247

    
1248
    if( nameChangeAction==ACTION_SUBR )
1249
      {
1250
      mCanvas.getRecords().submitRecord(SokobanLevels.getCurrLevel());
1251
      }
1252
    if( nameChangeAction==ACTION_SUBL )
1253
      {
1254
      SokobanLevel c = SokobanLevels.getInstance().getCreated();
1255
      mCanvas.getRecords().submitLevel(c.getCols(),c.encodeLevel());
1256
      }
1257

    
1258
    nameChangeAction = ACTION_NONE;
1259
    }
1260

    
1261
///////////////////////////////////////////////////////////////////////////////////////////////////
1262
// end of SokobanMenu class
1263
}
(8-8/12)