Friday, August 19, 2011

Solution : Maxlines Property in Silverlight TextBox

I have had this requirement since last week about putting a limit on the number of lines you can write in a multiline (AcceptsReturn=true) TextBox in Silverlight 4 and was disappointed to know that there is currently no way you do it like in WPF. In WPF, the TextBox control has an integer property called MaxLines which you can set to limit the number of lines. In Silverlight, there seems to be no way because you wouldn’t possibly know when or where in the string a word wrap split has occurred. It would be simple if you are using a fixed-width font like Courier/CourierNew because you can simply count the number of characters that would fit in one line, but in my case, its Comic Sans. The client insisted that they wanted this feature so I decided to write my own logic to simulate the word wrap algorithm used in Silverlight TextBoxes. Below is the result of what I did. The object below is a Silverlight textbox with MaxLines property set to 6.

What I did was I extended the Silverlight TextBox control and added my own logic to simulate how the word wrap behaves.

You may get the full source code of the extended textbox here. Enjoy!

Saturday, January 22, 2011

Timer for Android – Make a TextView Blink

 
I am pretty sure some of you may been through the same problem where you needed a simple periodic timer for your Android app. You may use java.util.Timer but this is not a good choice as this timer creates a new thread for some reason and you don’t want to invoke multiple threads in your mobile app. So I created this simple timer that makes use of the android.os.Handler class. Below is the source code of the Timer for android. Sorry for the formatting and naming convention. I’m used to the C# conventions.

package ross.brigoli.android;
import android.os.Handler;

public class Timer {
  private int _interval;
  public int getInterval() { return _interval; }
  public void setInterval(int delay) { _interval = delay; }
  private Handler handler;
  private Runnable _tickHandler;
  private Runnable delegate;
  private boolean ticking;
  public boolean getIsTicking(){ return ticking; }
 
  public Timer(int interval)
  {
    _interval = interval;
    handler = new Handler();
  }
 
  public Timer(int interval, Runnable onTickHandler)
  {
    _interval = interval;
    setOnTickHandler(onTickHandler);
    handler = new Handler();
  }
 
  public void start(int interval, Runnable onTickHandler)
  {
    if (ticking) return;
    _interval = interval;
    setOnTickHandler(onTickHandler);
    handler.postDelayed(delegate, _interval);
    ticking = true;
  }
 
  public void start()
  {
    if (ticking) return;
    handler.postDelayed(delegate, _interval);
    ticking = true;
  }
 
  public void stop()
  {
    handler.removeCallbacks(delegate);
    ticking = false;
  }
 
  public void setOnTickHandler(Runnable onTickHandler)
  {
    if (onTickHandler == null)
      return;
   
    _tickHandler = onTickHandler;
   
    delegate = new Runnable() {
      public void run()
      {
        if (_tickHandler == null) return;
        _tickHandler.run();
        handler.postDelayed(delegate, _interval);
      }
    };
  }
}

I used this timer to make a TextView in my Application blink, to update values in the UI from service, to monitor status, etc. with the following code:

  boolean blinkOn = false;
  Timer tmrBlink = new Timer(500, new Runnable() {

    public void run() {
      if (blinkOn)
      {
        ((TextView) findViewById(R.id.widget46)).setVisibility(View.VISIBLE);
      }
      else
      {
        ((TextView) findViewById(R.id.widget46)).setVisibility(View.INVISIBLE);
      }
      blinkOn = !blinkOn;
    }
   
  });

Popular