Hi Dany

Thats the way I did it now.
I was not sure if the second roundtrip would be the 'last' one.
I hope I will never need 'disableLazyLoading' because my trees are quite big... 

Thanks a lot!
Regards
Alex


-----Ursprüngliche Nachricht-----
Von: Daniel Grob [mailto:[EMAIL PROTECTED] 
Gesendet: Freitag, 29. September 2006 14:50
An: [email protected]
Cc: Stucki Alexander, Bedag
Betreff: Re: AW: [ULC-developer] How to expand the columns width of 
ULCTableTree? -> How to expand the width during startup?

Hi Alex,

Because of ULC's lazy loading feature it need's two round trips to upload the 
(visible part of the) table tree:
1. the round trip where your application uploads the table tree 2. the round 
trip where ULC uploads the visible data of the table tree

The second round trip is necessary because the visible part of the table tree 
can only be calculated on the client-side.
Therefore you should expand the column widths at the end of the second round 
trip and not at the end of the first one.
Note that the default behavior is to upload only the visible data in the second 
round trip. If you want to upload all table tree data at once you should set 
the "disableLazyLoading" client property to true.

The snippet at the end of my mail shows the enhanced solution.

Regards Dany




import java.awt.Component;

import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

import com.ulcjava.base.application.AbstractAction;
import com.ulcjava.base.application.AbstractApplication;
import com.ulcjava.base.application.ApplicationContext;
import com.ulcjava.base.application.ULCBorderLayoutPane;
import com.ulcjava.base.application.ULCButton;
import com.ulcjava.base.application.ULCFrame;
import com.ulcjava.base.application.ULCListSelectionModel;
import com.ulcjava.base.application.ULCProxy;
import com.ulcjava.base.application.ULCScrollPane;
import com.ulcjava.base.application.ULCTableTree;
import com.ulcjava.base.application.event.ActionEvent;
import com.ulcjava.base.application.event.IRoundTripListener;
import com.ulcjava.base.application.event.ITreeExpansionListener;
import com.ulcjava.base.application.event.RoundTripEvent;
import com.ulcjava.base.application.event.TreeExpansionEvent;
import com.ulcjava.base.application.tabletree.AbstractTableTreeModel;
import com.ulcjava.base.client.UIProxy;
import com.ulcjava.base.client.UITableTree;
import com.ulcjava.base.client.tabletree.TableTreeTree;
import com.ulcjava.base.development.ConnectionType;
import com.ulcjava.base.development.DevelopmentRunner;

public class ExpandTableTreeColumns extends AbstractApplication {
    public void start() {
        ULCTableTree tableTree = new ULCTableTree(new SnippetTableTreeModel());
        
tableTree.getColumnModel().getSelectionModel().setSelectionMode(ULCListSelectionModel.SINGLE_SELECTION);
        tableTree.setAutoResizeMode(ULCTableTree.AUTO_RESIZE_OFF);
        tableTree.setRowSelectionAllowed(false);
        tableTree.setColumnSelectionAllowed(true);
        tableTree.addTreeExpansionListener(new
ExpandTreeColumnAction(tableTree));
        tableTree.putClientProperty("disableLazyLoading", Boolean.TRUE);

        ULCFrame frame = new ULCFrame("Snippet");
        frame.setDefaultCloseOperation(ULCFrame.TERMINATE_ON_CLOSE);
        frame.getContentPane().add(new ULCScrollPane(tableTree));
        frame.getContentPane().add(new ULCButton(new 
ExpandSelectedColumnAction(tableTree)), ULCBorderLayoutPane.SOUTH);
        frame.pack();
        frame.setVisible(true);

        for (int i = 150; i < 160; i++) {
            tableTree.expandRow(i);
        }
        ApplicationContext.addRoundTripListener(new
LazyLoadingExpandAction(tableTree));
    }

    public static void main(String[] args) {
        DevelopmentRunner.setApplicationClass(ExpandTableTreeColumns.class);
        DevelopmentRunner.setConnectionType(ConnectionType.MODEM28K);
        DevelopmentRunner.main(args);
    }

    public static class ExpandSelectedColumnAction extends AbstractAction {
        private ULCTableTree fTableTree;

        public ExpandSelectedColumnAction(ULCTableTree tableTree) {
            fTableTree = tableTree;

            setEnabler(fTableTree.getColumnModel().getSelectionModel());
            putValue(NAME, "Expand Selected Column");
        }

        public void actionPerformed(ActionEvent event) {
            
ULCSnippetHelper.getInstance().expandTableTreeColumn(fTableTree,
fTableTree.getSelectedColumn());
        }
    }

    public static class ExpandTreeColumnAction implements 
ITreeExpansionListener {
        private final ULCTableTree fTableTree;

        public ExpandTreeColumnAction(ULCTableTree tableTree) {
            fTableTree = tableTree;
        }

        public void treeCollapsed(TreeExpansionEvent event) {
        }

        public void treeExpanded(TreeExpansionEvent event) {
            int treeColumn = fTableTree.getModel().getTreeColumn();
            
ULCSnippetHelper.getInstance().expandTableTreeColumn(fTableTree,
treeColumn);
        }
    }

    public static class LazyLoadingExpandAction implements IRoundTripListener {
        private final ULCTableTree fTableTree;

        private int fRoundTripCount;

        public LazyLoadingExpandAction(ULCTableTree tableTree) {
            fTableTree = tableTree;
            fRoundTripCount = 0;
        }

        public void roundTripDidStart(RoundTripEvent event) {
        }

        public void roundTripWillEnd(RoundTripEvent event) {
            fRoundTripCount++;

            if (fRoundTripCount == 2) {
                for (int i = 0; i < fTableTree.getColumnCount(); i++) {
                    
ULCSnippetHelper.getInstance().expandTableTreeColumn(fTableTree, i);
                }

                ApplicationContext.removeRoundTripListener(this);
            }
        }
    }

    public static class ULCSnippetHelper extends ULCProxy {
        private static final String INSTANCE_KEY =
ULCSnippetHelper.class.getName() + ".INSTANCE";

        private ULCSnippetHelper() {
            upload();
            markUncollectable();
        }

        public static ULCSnippetHelper getInstance() {
            ULCSnippetHelper result = (ULCSnippetHelper) 
ApplicationContext.getAttribute(INSTANCE_KEY);
            if (result == null) {
                result = new ULCSnippetHelper();
                ApplicationContext.setAttribute(INSTANCE_KEY, result);
            }

            return result;
        }

        public void expandTableTreeColumn(ULCTableTree tableTree, int
column) {
            invokeUI("expandTableTreeColumn", new Object[] { tableTree, new 
Integer(column) });
        }

        protected String typeString() {
            return UISnippetHelper.class.getName();
        }
    }

    public static class UISnippetHelper extends UIProxy {
        public void expandTableTreeColumn(UITableTree tableTree, int
resizingColumnIndex) {
            final JTable basicTable =
tableTree.getBasicTableTree().getBasicTable();
            TableColumn resizingColumn = 
basicTable.getColumnModel().getColumn(resizingColumnIndex);

            // set the table column's width as if the user is resizing a table
            // column by mouse
            // -> BaiscTableHeaderUI.MouseInputHandler and JTable.doLayout()
            basicTable.getTableHeader().setResizingColumn(resizingColumn);
            resizingColumn.setWidth(toPreferredWidth(tableTree,
resizingColumnIndex));
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    basicTable.getTableHeader().setResizingColumn(null);
                }
            });
        }

        private static int toPreferredWidth(UITableTree tableTree, int
columnIndex) {
            TableTreeTree basicTree = (TableTreeTree) 
tableTree.getBasicTableTree().getBasicTree();
            JTable basicTable =
tableTree.getBasicTableTree().getBasicTable();
            TableColumn column =
basicTable.getColumnModel().getColumn(columnIndex);

            int result = column.getMinWidth();
            for (int i = 0; i < basicTable.getRowCount(); i++) {
                TableCellRenderer renderer = getCellRenderer(basicTable, i, 
columnIndex);
                Component component =
basicTable.prepareRenderer(renderer, i, columnIndex);
                int preferredWidth = component.getPreferredSize().width;

                // consider tree handle and icon for the tree column
                if (isTreeColumn(tableTree, columnIndex)) {
                    preferredWidth += basicTree.getTableCellOffset(i);
                }

                result = Math.max(result, preferredWidth);
            }

            result += basicTable.getColumnModel().getColumnMargin();

            return Math.min(result, column.getMaxWidth());
        }

        private static boolean isTreeColumn(UITableTree tableTree, int
columnIndex) {
            JTable basicTable =
tableTree.getBasicTableTree().getBasicTable();
            return basicTable.convertColumnIndexToModel(columnIndex) ==
tableTree.getBasicTableTree().getModel()
                    .getTreeColumn();
        }

        // we can't use TableTreeTable's getCellRenderer method as this one is
        // overwritten
        // -> copy & pasted code from JTable.getCellRenderer()
        private static TableCellRenderer getCellRenderer(JTable table, int row, 
int column) {
            TableColumn tableColumn =
table.getColumnModel().getColumn(column);
            TableCellRenderer result = tableColumn.getCellRenderer();
            if (result == null) {
                result =
table.getDefaultRenderer(table.getColumnClass(column));
            }
            return result;
        }
    }

    public static class SnippetTableTreeModel extends AbstractTableTreeModel {
        public boolean isLeaf(Object node) {
            return false;
        }

        public Object getValueAt(Object node, int column) {
            return node.toString() + ":" + column;
        }

        public Object getRoot() {
            return "root";
        }

        public int getIndexOfChild(Object parent, Object child) {
            String childValue = child.toString();
            int index = childValue.lastIndexOf('.');
            return Integer.parseInt(childValue.substring(index + 1));
        }

        public int getColumnCount() {
            return 3;
        }

        public int getChildCount(Object parent) {
            return parent == getRoot() ? 200 : 4;
        }

        public Object getChild(Object parent, int index) {
            return parent.toString() + "." + index;
        }
    }
}


Stucki Alexander, Bedag wrote:
> Hi Dany
>
> Thanks a lot for your solution!!!
> It works fine... ...but ;)
>
> 1. Because I must show the hole text even if the tree itself is smaller I had 
> to set tableTree.setAutoResizeMode(ULCTableTree.AUTO_RESIZE_OFF).
> 2. I added a TreeExpansionListener to adjust the column if a node is expanded.
>
> So far it's perfect.
>
> But now I can not initialise the column correctly. Because I had to turn off 
> AUTO-RESIZE the column is show at the beginning with its default width...
> I tried UlcUtilities.invokeLater() and UITableTree.postInitializeState() but 
> the column width is even reduced.
> Then I tried a IRoundTripListener and there I could not remove the 
> listener when tableTree.isUploaded() was true because the width is as 
> well reduced... ...the RoundTripListener is called twice and then the 
> width is ok. ?-/
>
> When do I know that the UI is completely uploaded during startup?
>
> Thanks a lot!!
> Regards
> Alex
>
> Here my snippet : 
>
> import java.awt.Component;
>
> import javax.swing.JTable;
> import javax.swing.SwingUtilities;
> import javax.swing.table.TableCellRenderer;
> import javax.swing.table.TableColumn;
>
> import com.ulcjava.base.application.AbstractAction;
> import com.ulcjava.base.application.AbstractApplication;
> import com.ulcjava.base.application.ApplicationContext;
> import com.ulcjava.base.application.ULCBorderLayoutPane;
> import com.ulcjava.base.application.ULCButton;
> import com.ulcjava.base.application.ULCFrame;
> import com.ulcjava.base.application.ULCListSelectionModel;
> import com.ulcjava.base.application.ULCProxy;
> import com.ulcjava.base.application.ULCScrollPane;
> import com.ulcjava.base.application.ULCTableTree;
> import com.ulcjava.base.application.event.ActionEvent;
> import com.ulcjava.base.application.event.IRoundTripListener;
> import com.ulcjava.base.application.event.ITreeExpansionListener;
> import com.ulcjava.base.application.event.RoundTripEvent;
> import com.ulcjava.base.application.event.TreeExpansionEvent;
> import com.ulcjava.base.application.tabletree.AbstractTableTreeModel;
> import com.ulcjava.base.application.util.Dimension;
> import com.ulcjava.base.client.UIProxy; import 
> com.ulcjava.base.client.UITableTree;
> import com.ulcjava.base.client.tabletree.TableTreeTree;
> import com.ulcjava.base.development.DevelopmentRunner;
>
> public class MyExpandTableTreeColumns extends AbstractApplication {
>
>       public void start() {
>       final ULCTableTree tableTree = new MyULCTableTree();
>         tableTree.setModel(new SnippetTableTreeModel());
>         
> tableTree.getColumnModel().getSelectionModel().setSelectionMode(ULCListSelectionModel.SINGLE_SELECTION);
>         tableTree.setRowSelectionAllowed(false);
>         tableTree.setColumnSelectionAllowed(true);
>         tableTree.setAutoResizeMode(ULCTableTree.AUTO_RESIZE_OFF);
>         tableTree.addTreeExpansionListener(new ITreeExpansionListener(){
>               public void treeCollapsed(TreeExpansionEvent arg0) { /* noop */ 
> }
>               public void treeExpanded(TreeExpansionEvent arg0) {
>               if(-1 == tableTree.getSelectedColumn()){
>                       tableTree.setColumnSelectionInterval(0,0);
>               }
>                 
> ULCSnippetHelper.getInstance().expandTableTreeColumn(tableTree,
>                               tableTree.getSelectedColumn());
>             }
>       });
>
>         ApplicationContext.addRoundTripListener(new IRoundTripListener(){
>                       public void roundTripDidStart(RoundTripEvent arg0) { /* 
> noop */ }
>                       public void roundTripWillEnd(RoundTripEvent arg0) {
>                               if(tableTree.isUploaded()){
>                       if(-1 == tableTree.getSelectedColumn()){
>                               tableTree.setColumnSelectionInterval(0,0);
>                       }
>                       
> ULCSnippetHelper.getInstance().expandTableTreeColumn(tableTree,
>                                       tableTree.getSelectedColumn());
>                                       
> System.out.println("roundTripWillEnd...");
> //                    ApplicationContext.removeRoundTripListener(this);
>                               }
>                       }
>       });
>         
>         ULCFrame frame = new ULCFrame("Snippet");
>         frame.setDefaultCloseOperation(ULCFrame.TERMINATE_ON_CLOSE);
>         frame.getContentPane().add(new ULCScrollPane(tableTree));
>         frame.getContentPane().add(
>                 new ULCButton(new ExpandSelectedColumnAction(tableTree)),
>                 ULCBorderLayoutPane.SOUTH);
>         frame.pack();
>         frame.setSize(new Dimension(200,300));
>         frame.setVisible(true);
>         
>         //init columnwidth
> //        UlcUtilities.invokeLater(new Runnable(){
> //                    public void run() {
> //                            tableTree.setColumnSelectionInterval(0,0);
> //                            
> ULCSnippetHelper.getInstance().expandTableTreeColumn(tableTree,
> //                            tableTree.getSelectedColumn());
> //                    }
> //        });
>     }
>
>     public static void main(String[] args) {
>         DevelopmentRunner.setApplicationClass(MyExpandTableTreeColumns.class);
>         DevelopmentRunner.main(args);
>     }
>
>     public static class MyULCTableTree extends ULCTableTree {
>         protected String typeString() {
>             return MyUITableTree.class.getName();
>         }
>     }
>     
>     public static class MyUITableTree extends UITableTree {
>       public void postInitializeState(){
>               super.postInitializeState();
> //                    UISnippetHelper.expandTableTreeColumn(this, 0);
>       }
>     }
>     
>     public static class ExpandSelectedColumnAction extends AbstractAction {
>         private ULCTableTree fTableTree;
>
>         public ExpandSelectedColumnAction(ULCTableTree tableTree) {
>             fTableTree = tableTree;
>
>             setEnabler(fTableTree.getColumnModel().getSelectionModel());
>             putValue(NAME, "Expand Selected Column");
>         }
>
>         public void actionPerformed(ActionEvent event) {
>             ULCSnippetHelper.getInstance().expandTableTreeColumn(fTableTree,
>                     fTableTree.getSelectedColumn());
>         }
>     }
>
>     public static class ULCSnippetHelper extends ULCProxy {
>         private static final String INSTANCE_KEY = ULCSnippetHelper.class
>                 .getName()
>                 + ".INSTANCE";
>
>         private ULCSnippetHelper() {
>             upload();
>             markUncollectable();
>         }
>
>         public static ULCSnippetHelper getInstance() {
>             ULCSnippetHelper result = (ULCSnippetHelper) ApplicationContext
>                     .getAttribute(INSTANCE_KEY);
>             if (result == null) {
>                 result = new ULCSnippetHelper();
>                 ApplicationContext.setAttribute(INSTANCE_KEY, result);
>             }
>
>             return result;
>         }
>
>         public void expandTableTreeColumn(ULCTableTree tableTree, int column) 
> {
>             invokeUI("expandTableTreeColumn", new Object[] { tableTree,
>                     new Integer(column) });
>         }
>
>         protected String typeString() {
>             return UISnippetHelper.class.getName();
>         }
>     }
>
>     public static class UISnippetHelper extends UIProxy {
>         public static void expandTableTreeColumn(UITableTree tableTree,
>                 int resizingColumnIndex) {
>             final JTable basicTable = 
> tableTree.getBasicTableTree().getBasicTable();
>             TableColumn resizingColumn = 
> basicTable.getColumnModel().getColumn(
>                     resizingColumnIndex);
>
>             // set the table column's width as if the user is resizing a 
> table column by mouse
>             // -> BaiscTableHeaderUI.MouseInputHandler and JTable.doLayout()
>             basicTable.getTableHeader().setResizingColumn(resizingColumn);
>             resizingColumn.setWidth(toPreferredWidth(tableTree, 
> resizingColumnIndex));
>             SwingUtilities.invokeLater(new Runnable() {
>                 public void run() {
>                     basicTable.getTableHeader().setResizingColumn(null);
>                 }
>             });
>         }
>
>         private static int toPreferredWidth(UITableTree tableTree,
>                 int columnIndex) {
>             TableTreeTree basicTree = (TableTreeTree) tableTree
>                     .getBasicTableTree().getBasicTree();
>             JTable basicTable = tableTree.getBasicTableTree().getBasicTable();
>             TableColumn column = 
> basicTable.getColumnModel().getColumn(columnIndex);
>
>             int result = column.getMinWidth();
>             for (int i = 0; i < basicTable.getRowCount(); i++) {
>                 TableCellRenderer renderer = getCellRenderer(basicTable, i,
>                         columnIndex);
>                 Component component = basicTable.prepareRenderer(renderer, i,
>                         columnIndex);
>                 int preferredWidth = 
> component.getPreferredSize().width;
>                
>                 // consider tree handle and icon for the tree column
>                 if (isTreeColumn(tableTree, columnIndex)) {
>                     preferredWidth += basicTree.getTableCellOffset(i);
>                 }
>                
>                 result = Math.max(result, preferredWidth);
>             }
>
>             result += basicTable.getColumnModel().getColumnMargin();
>
>             return Math.min(result, column.getMaxWidth());
>         }
>
>         private static boolean isTreeColumn(UITableTree tableTree,
>                 int columnIndex) {
>             JTable basicTable = tableTree.getBasicTableTree().getBasicTable();
>             return basicTable.convertColumnIndexToModel(columnIndex) == 
> tableTree
>                     .getBasicTableTree().getModel().getTreeColumn();
>         }
>
>         // we can't use TableTreeTable's getCellRenderer method as this one 
> is overwritten
>         // -> copy & pasted code from JTable.getCellRenderer()
>         private static TableCellRenderer getCellRenderer(JTable table, 
>                                                                               
>                      int row,
>                                                                               
>                      int column) {
>             TableColumn tableColumn = 
> table.getColumnModel().getColumn(column);
>             TableCellRenderer result = tableColumn.getCellRenderer();
>             if (result == null) {
>                 result = 
> table.getDefaultRenderer(table.getColumnClass(column));
>             }
>             return result;
>         }
>     }
>
>     public static class SnippetTableTreeModel extends AbstractTableTreeModel {
>         public boolean isLeaf(Object node) {
>             return false;
>         }
>
>         public Object getValueAt(Object node, int column) {
>             return node.toString() + ":" + column;
>         }
>
>         public Object getRoot() {
>             return "root";
>         }
>
>         public int getIndexOfChild(Object parent, Object child) {
>             String childValue = child.toString();
>             int index = childValue.lastIndexOf('.');
>             return Integer.parseInt(childValue.substring(index + 1));
>         }
>
>         public int getColumnCount() {
>             return 3;
>         }
>
>         public int getChildCount(Object parent) {
>             return 4;
>         }
>
>         public Object getChild(Object parent, int index) {
>             return parent.toString() + "." + index;
>         }
>     }
> }
>
>
>
>
>  
>
> -----Ursprüngliche Nachricht-----
> Von: Daniel Grob [mailto:[EMAIL PROTECTED]
> Gesendet: Dienstag, 19. September 2006 22:39
> An: [email protected]; Stucki Alexander, Bedag
> Betreff: Re: [ULC-developer] How to expand the columns width of ULCTableTree?
>
> Hi Alex,
>
> This was a hard one for two reasons:
> 1. In Swing it is difficult to programatically set the width of a 
> column
> (?!?)
> 2. ULC's tree column handling is implemented in a special way
>
> However, you can find a solution at the end of my mail.
>
> Regards Dany
>
>
> import java.awt.Component;
>
> import javax.swing.JTable;
> import javax.swing.SwingUtilities;
> import javax.swing.table.TableCellRenderer;
> import javax.swing.table.TableColumn;
>
> import com.ulcjava.base.application.AbstractAction;
> import com.ulcjava.base.application.AbstractApplication;
> import com.ulcjava.base.application.ApplicationContext;
> import com.ulcjava.base.application.ULCBorderLayoutPane;
> import com.ulcjava.base.application.ULCButton;
> import com.ulcjava.base.application.ULCFrame;
> import com.ulcjava.base.application.ULCListSelectionModel;
> import com.ulcjava.base.application.ULCProxy;
> import com.ulcjava.base.application.ULCScrollPane;
> import com.ulcjava.base.application.ULCTableTree;
> import com.ulcjava.base.application.event.ActionEvent;
> import com.ulcjava.base.application.tabletree.AbstractTableTreeModel;
> import com.ulcjava.base.client.UIProxy; import 
> com.ulcjava.base.client.UITableTree;
> import com.ulcjava.base.client.tabletree.TableTreeTree;
> import com.ulcjava.base.development.DevelopmentRunner;
>
> public class ExpandTableTreeColumns extends AbstractApplication {
>     public void start() {
>         ULCTableTree tableTree = new ULCTableTree(new 
> SnippetTableTreeModel());
>         tableTree.getColumnModel().getSelectionModel().setSelectionMode(
>                 ULCListSelectionModel.SINGLE_SELECTION);
>         tableTree.setRowSelectionAllowed(false);
>         tableTree.setColumnSelectionAllowed(true);
>
>         ULCFrame frame = new ULCFrame("Snippet");
>         frame.setDefaultCloseOperation(ULCFrame.TERMINATE_ON_CLOSE);
>         frame.getContentPane().add(new ULCScrollPane(tableTree));
>         frame.getContentPane().add(
>                 new ULCButton(new ExpandSelectedColumnAction(tableTree)),
>                 ULCBorderLayoutPane.SOUTH);
>         frame.pack();
>         frame.setVisible(true);
>     }
>
>     public static void main(String[] args) {
>         DevelopmentRunner.setApplicationClass(ExpandTableTreeColumns.class);
>         DevelopmentRunner.main(args);
>     }
>
>     public static class ExpandSelectedColumnAction extends AbstractAction {
>         private ULCTableTree fTableTree;
>
>         public ExpandSelectedColumnAction(ULCTableTree tableTree) {
>             fTableTree = tableTree;
>
>             setEnabler(fTableTree.getColumnModel().getSelectionModel());
>             putValue(NAME, "Expand Selected Column");
>         }
>
>         public void actionPerformed(ActionEvent event) {
>             ULCSnippetHelper.getInstance().expandTableTreeColumn(fTableTree,
>                     fTableTree.getSelectedColumn());
>         }
>     }
>
>     public static class ULCSnippetHelper extends ULCProxy {
>         private static final String INSTANCE_KEY = ULCSnippetHelper.class
>                 .getName()
>                 + ".INSTANCE";
>
>         private ULCSnippetHelper() {
>             upload();
>             markUncollectable();
>         }
>
>         public static ULCSnippetHelper getInstance() {
>             ULCSnippetHelper result = (ULCSnippetHelper) ApplicationContext
>                     .getAttribute(INSTANCE_KEY);
>             if (result == null) {
>                 result = new ULCSnippetHelper();
>                 ApplicationContext.setAttribute(INSTANCE_KEY, result);
>             }
>
>             return result;
>         }
>
>         public void expandTableTreeColumn(ULCTableTree tableTree, int
> column) {
>             invokeUI("expandTableTreeColumn", new Object[] { tableTree,
>                     new Integer(column) });
>         }
>
>         protected String typeString() {
>             return UISnippetHelper.class.getName();
>         }
>     }
>
>     public static class UISnippetHelper extends UIProxy {
>         public void expandTableTreeColumn(UITableTree tableTree,
>                 int resizingColumnIndex) {
>             final JTable basicTable = tableTree.getBasicTableTree()
>                     .getBasicTable();
>             TableColumn resizingColumn = 
> basicTable.getColumnModel().getColumn(
>                     resizingColumnIndex);
>
>             // set the table column's width as if the user is resizing a 
> table column by mouse
>             // -> BaiscTableHeaderUI.MouseInputHandler and JTable.doLayout()
>             basicTable.getTableHeader().setResizingColumn(resizingColumn);
>             resizingColumn.setWidth(toPreferredWidth(tableTree,
> resizingColumnIndex));
>             SwingUtilities.invokeLater(new Runnable() {
>                 public void run() {
>                     basicTable.getTableHeader().setResizingColumn(null);
>                 }
>             });
>         }
>
>         private static int toPreferredWidth(UITableTree tableTree,
>                 int columnIndex) {
>             TableTreeTree basicTree = (TableTreeTree) tableTree
>                     .getBasicTableTree().getBasicTree();
>             JTable basicTable =
> tableTree.getBasicTableTree().getBasicTable();
>             TableColumn column = basicTable.getColumnModel().getColumn(
>                     columnIndex);
>
>             int result = column.getMinWidth();
>             for (int i = 0; i < basicTable.getRowCount(); i++) {
>                 TableCellRenderer renderer = getCellRenderer(basicTable, i,
>                         columnIndex);
>                 Component component =
> basicTable.prepareRenderer(renderer, i,
>                         columnIndex);
>                 int preferredWidth = 
> component.getPreferredSize().width;
>                
>                 // consider tree handle and icon for the tree column
>                 if (isTreeColumn(tableTree, columnIndex)) {
>                     preferredWidth += basicTree.getTableCellOffset(i);
>                 }
>                
>                 result = Math.max(result, preferredWidth);
>             }
>
>             result += basicTable.getColumnModel().getColumnMargin();
>
>             return Math.min(result, column.getMaxWidth());
>         }
>
>         private static boolean isTreeColumn(UITableTree tableTree,
>                 int columnIndex) {
>             JTable basicTable =
> tableTree.getBasicTableTree().getBasicTable();
>             return basicTable.convertColumnIndexToModel(columnIndex) == 
> tableTree
>                     .getBasicTableTree().getModel().getTreeColumn();
>         }
>
>         // we can't use TableTreeTable's getCellRenderer method as this one 
> is overwritten
>         // -> copy & pasted code from JTable.getCellRenderer()
>         private static TableCellRenderer getCellRenderer(JTable table, int 
> row,
>                 int column) {
>             TableColumn tableColumn =
> table.getColumnModel().getColumn(column);
>             TableCellRenderer result = tableColumn.getCellRenderer();
>             if (result == null) {
>                 result =
> table.getDefaultRenderer(table.getColumnClass(column));
>             }
>             return result;
>         }
>     }
>
>     public static class SnippetTableTreeModel extends AbstractTableTreeModel {
>         public boolean isLeaf(Object node) {
>             return false;
>         }
>
>         public Object getValueAt(Object node, int column) {
>             return node.toString() + ":" + column;
>         }
>
>         public Object getRoot() {
>             return "root";
>         }
>
>         public int getIndexOfChild(Object parent, Object child) {
>             String childValue = child.toString();
>             int index = childValue.lastIndexOf('.');
>             return Integer.parseInt(childValue.substring(index + 1));
>         }
>
>         public int getColumnCount() {
>             return 3;
>         }
>
>         public int getChildCount(Object parent) {
>             return 4;
>         }
>
>         public Object getChild(Object parent, int index) {
>             return parent.toString() + "." + index;
>         }
>     }
> }
>
>
>
>   
>> Hi All
>>
>> I want to expand the column width of my ULCTableTree according the 
>> values of the column cells.
>> The tree is in a ScrollPane and then I tried to figure out the 
>> PreferredSize of every cell.
>> I have found an example doing this in a JTable by asking the 
>> CellRendererComponent for its PreferredSize.
>>
>> I tried it on server and on client side without success (missing 
>> cellRendererComponent, fix preferredSize of the column, etc).
>>
>> Does anybody know an example for this problem?
>> How do I get the best width for a cell value without calculating it 
>> myself?
>>
>> TIA!
>> Alex
>>
>> Alex Stucki
>> Bedag Informatik AG
>> Software-Entwicklung
>> Gutenbergstrasse 1
>> 3011 Bern
>> Telefon:        +41 (0)31 633 21 21 (direkt 633 25 35)
>> E-Mail:         _mailto:[EMAIL PROTECTED]
>> _www.bedag.ch_ <file://www.bedag.ch>
>>
>>
>>     
>
> _______________________________________________
> ULC-developer mailing list
> [email protected]
> http://lists.canoo.com/mailman/listinfo/ulc-developer
>
>   

_______________________________________________
ULC-developer mailing list
[email protected]
http://lists.canoo.com/mailman/listinfo/ulc-developer

Reply via email to