text widget refactor. closes #20