[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[news.eclipse.platform.swt] Dynamically resizing Text Control

Its great to finally see a newsgroup dedicated to SWT! I am trying to
dynamically resize a Text control based on its contents. I basically added
a modify listener which calls pack() to recompute the preferred size of
the control each time it is modified. The problem I have is after I type
the first character, the control resizes but shifts my contents to the
left. It seems like the preferred size always needs some extra buffer
space at the end. 

The code snippet I used is shown below. I can get the desired effect by 
uncommenting the kludge code but I'd like to find a better way if possible.

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class Name {
  public static void main(String[] args) {
    Display display = new Display();
    final Shell shell = new Shell(display);
    final Text firstname = new Text(shell, SWT.BORDER);
    firstname.setText("");
    firstname.setSize(firstname.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    firstname.setTextLimit(15);
    firstname.addModifyListener(new ModifyListener() {
      public void modifyText(ModifyEvent e) {
        firstname.pack(true);
    
         /* Kludge
        int columns = firstname.getText().length() + 3;
        GC gc = new GC (firstname);
        FontMetrics fm = gc.getFontMetrics ();
        int width = columns * fm.getAverageCharWidth ();
        int height = fm.getHeight ();
        gc.dispose ();
        firstname.setSize (firstname.computeSize (width, height));
        */
      }
    });

    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
      display.sleep();
    }
    display.dispose();
  }
}

Ash