Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

How to create multiline table cell in JAVA SWT package?

Posted on 2013-11-15
3
Medium Priority
?
2,097 Views
Last Modified: 2013-11-18
Hi,
I am working on a GUI and I have a table where there will be multiple lines in the cells of the table.

I found the following example but it has a problem because it assumes the maximum number of lines in each row will be equal (In this example, it is 3.). However, in my case, each row has different number of lines.

http://www.java2s.com/Tutorial/Java/0280__SWT/MultilineTablecell.htm

If you look at the screenshot in this example, each row has 3 lines in at least one cell in a row. This makes the problem invisible in this example, but if you have 3 lines in one row and 50 lines in the other row, this code makes each row with 50 lines. and it looks weird because the row that has one line has so many empty lines.

Can you please help me to fix this problem in this code, so that I can implement the same logic in my code?

Thanks
0
Comment
Question by:Tolgar
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 36

Accepted Solution

by:
mccarl earned 1500 total points
ID: 39655257
Can you please help me to fix this problem in this code, so that I can implement the same logic in my code?
It's not a problem in your code, it is a limitation of the SWT table widget (at least on Windows). All rows have to be the same height. There really isn't any way around it. Your only other option is to use a different table widget from a third party library, eg...

http://sourceforge.net/projects/agilegrid/
http://netanel.pl/products/swtmatrix
http://eclipse.org/nattable/
http://www.eclipse.org/nebula/widgets/grid/grid.php

... and probably many more

(Note that the above is a list of alternative table widgets, I will leave it up to you to investigate which ones might meet your requirements, such as differing row heights, etc)
0
 

Author Comment

by:Tolgar
ID: 39655417
Thanks Carl.

Based on a user comment on agile grid website, agilegrid (http://sourceforge.net/projects/agilegrid/) will solve my problem.

Can you please help me on how to use this widget in my code?


I really appreciate your continuous and thorough help!


Please see my code below:

import java.net.URISyntaxException;
import java.text.Collator;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;

import com.perforce.p4java.client.IClient;
import com.perforce.p4java.client.IClientSummary;
import com.perforce.p4java.core.IChangelist;
import com.perforce.p4java.core.IChangelistSummary;
import com.perforce.p4java.core.file.FileSpecBuilder;
import com.perforce.p4java.core.file.IFileSpec;
import com.perforce.p4java.exception.AccessException;
import com.perforce.p4java.exception.ConfigException;
import com.perforce.p4java.exception.ConnectionException;
import com.perforce.p4java.exception.NoSuchObjectException;
import com.perforce.p4java.exception.P4JavaException;
import com.perforce.p4java.exception.RequestException;
import com.perforce.p4java.exception.ResourceException;
import com.perforce.p4java.option.server.GetChangelistsOptions;
import com.perforce.p4java.option.server.GetClientsOptions;
import com.perforce.p4java.server.IOptionsServer;
import com.perforce.p4java.server.IServer;
import com.perforce.p4java.server.ServerFactory;



public class ChangeListDlg extends Dialog {
    
    public static SelectedFileFoldersModel model = new SelectedFileFoldersModel();
    
    public static String changelistNum;
    
    public String getFileFolders()
    {
        return model.getFileOrFolderData();
    }

    public ChangeListDlg(Shell parent) {
        super(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL);
    }
    
    public void open() {
        Shell shell = new Shell(getParent(), getStyle());
        shell.setText("Select changelist");
        try {
			createContents(shell);
		} catch (ConnectionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RequestException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ConfigException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchObjectException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ResourceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}               
        
        shell.pack();
        shell.open();
        
     // Move the dialog to the center of the top level shell.
        Rectangle shellBounds = getParent().getBounds();
        Rectangle dialogSize = shell.getBounds();

        shell.setLocation(
          shellBounds.x + (shellBounds.width - dialogSize.width) / 2,
          shellBounds.y + (shellBounds.height - dialogSize.height) / 2 );
        
        
        int frameX = shell.getSize().x - shell.getClientArea().width;
        int frameY = shell.getSize().y - shell.getClientArea().height;
        shell.setSize(500 + frameX, 300 + frameY);
        
        
        Display display = getParent().getDisplay();
        while (!shell.isDisposed()) {
          if (!display.readAndDispatch()) {
            display.sleep();
          }
        }
    }

    public List<IClientSummary> getAllPerforceWorkspaces(IOptionsServer p4d){
                        
            //for getting all the workspaces
            GetClientsOptions clientOptions = new GetClientsOptions();
            List<IClientSummary> clientSummaryList = null;
			try {
				clientSummaryList = p4d.getClients(clientOptions);
			} catch (P4JavaException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            System.out.println(clientSummaryList.size());           

        return clientSummaryList;
    }

    
    private void createContents(final Shell shell) throws ConnectionException, AccessException, RequestException, ConfigException, NoSuchObjectException, ResourceException, URISyntaxException {
    	
    	//Connect to Perforce Server
    	final IOptionsServer p4d = ServerFactory.getOptionsServer(
			        ServerFactory.DEFAULT_PROTOCOL_NAME 
			        + "://" + "someserver", null);
			
			p4d.setUserName("tolgar");			

			p4d.connect();
        
    
        //Get the workspace and changelist information from Perforce
        List<IClientSummary> clientSummaryList = getAllPerforceWorkspaces(p4d);
                
        shell.setLayout(new GridLayout(2, false));
        
//        GridLayout groupLayoutTwoRows = new GridLayout();
//        Group groupTwoRows = new Group(shell, SWT.NONE);       
//        groupTwoRows.setLayout(groupLayoutTwoRows);
//        GridData firstRowGridData = new GridData(GridData.FILL_BOTH);
//        groupTwoRows.setLayoutData(firstRowGridData);
//        groupTwoRows.setLayout(new GridLayout(2, true));

//        Label label_submitted = new Label(shell, SWT.NONE);
//        label_submitted.setText("Type changelists");
//        GridData data_submitted = new GridData();
//        data_submitted.horizontalSpan = 2;
//        label_submitted.setLayoutData(data_submitted);
//        
//        final Text text_submittedChangelist = new Text(shell, SWT.BORDER);
//        data_submitted = new GridData(GridData.FILL_HORIZONTAL);
//        data_submitted.horizontalSpan = 2;
//        text_submittedChangelist.setLayoutData(data_submitted);
        // --------- second row -----------------
//        Label label_shelvedPending = new Label(shell, SWT.NONE);
//        label_shelvedPending.setText("Or select changelists by username and workspace:");
//        GridData data_shelvedPending = new GridData();
//        data_shelvedPending.horizontalSpan = 2;
//        label_shelvedPending.setLayoutData(data_shelvedPending);
        
        Label label_submitted = new Label(shell, SWT.NONE);
        label_submitted.setText("Type changelists");
        GridData data_submitted = new GridData();
        data_submitted.horizontalAlignment = SWT.FILL;
        data_submitted.grabExcessHorizontalSpace = true;
        label_submitted.setLayoutData(data_submitted);
             
        Label label_workspace = new Label(shell, SWT.NONE);
        label_workspace.setText("Workspace:");
        GridData data_workspace = new GridData();
        data_workspace.verticalAlignment = SWT.TOP;
        label_workspace.setLayoutData(data_workspace);
        
        final Text text_submittedChangelist = new Text(shell, SWT.BORDER | SWT.NONE);
        GridData data_textSubmittedChangelist = new GridData();
        data_textSubmittedChangelist.horizontalAlignment = SWT.FILL;
        data_textSubmittedChangelist.grabExcessHorizontalSpace = true;
        text_submittedChangelist.setLayoutData(data_textSubmittedChangelist);
        
        final Combo combo_workspaces = new Combo(shell, SWT.READ_ONLY);
        GridData data_comboWorkspaces = new GridData();
        //data_comboWorkspaces.horizontalAlignment = SWT.FILL;
        //data_textSubmittedChangelist.grabExcessHorizontalSpace = true;
        combo_workspaces.setLayoutData(data_comboWorkspaces);
        combo_workspaces.setEnabled(true);
        //GridData data_comboWorkspaces = new GridData(GridData.FILL_HORIZONTAL);
        //combo_workspaces.setLayoutData(data_comboWorkspaces);
        
        
        //public static Table table;
    	final List<Integer> changeListsArray = new ArrayList<Integer>();
    	final List<StringBuilder> fileListArray = new ArrayList<StringBuilder>();
    	final List<String> stateArray = new ArrayList<String>();
    	final List<String> changeListDescriptionsArray = new ArrayList<String>();

        List<String> workspacesArray = new ArrayList<String>();
        final String[] changelistStateArray = {"Pending", "Shelved", "Submitted"};     
        
        //This is to create the data(changelist number, file name, description) in each column using P4JAVA
        final GetChangelistsOptions getoptions = new GetChangelistsOptions();
        //getoptions.setType(IChangelist.Type.SUBMITTED);
        for(IClientSummary eachChangeSummary : clientSummaryList){
            String eachClientName = eachChangeSummary.getName();
            workspacesArray.add(eachChangeSummary.getName());
        }
        
        //The following line will be deleted once p4java is used to get the workspaces
        //String items[] = { "Workspace # One", "Workspace # Two", "Workspace # Three" };
        
        //combo_workspaces.setItems(items); combo_workspaces.select(2);
        combo_workspaces.setItems(workspacesArray.toArray(new String[workspacesArray.size()]));


        // ----------- the table -----------------
        GridLayout groupLayoutTable = new GridLayout();
        Group groupTable = new Group(shell, SWT.NONE);       
        groupTable.setLayout(groupLayoutTable);        
        
        final Table table = new Table(groupTable, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.WRAP | SWT.MULTI | SWT.CENTER);
        GridData tableGridData = new GridData(GridData.FILL_BOTH);
        tableGridData.horizontalSpan = 2;
        tableGridData.horizontalAlignment = SWT.FILL;
        tableGridData.grabExcessHorizontalSpace = true;
        tableGridData.verticalAlignment = SWT.FILL;
        tableGridData.grabExcessVerticalSpace = true;
        groupTable.setLayoutData(tableGridData);
        
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        table.getVerticalBar().setVisible(true);
        final String[] titles = { " ", "  Status  ", "Changelist", "Files", "Description" };
        
        //This is to create the column titles
        for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
            TableColumn column = new TableColumn(table, SWT.NULL);
            column.setText(titles[loopIndex]);
        }
        
        int frameShellWidth = shell.getSize().x;
        tableGridData.widthHint = frameShellWidth;
        table.setLayoutData(tableGridData);
        
        for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
            table.getColumn(loopIndex).pack();
       }
      table.setRedraw(true);
        
        //String selectedWorkspace = combo_workspaces.getText();
        //if(eachClientName.contains(selectedWorkspace)){
        
        combo_workspaces.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) { 
            	
            	
            	//clear the table
            	 table.removeAll();
            	
	        	for (String changelistState : changelistStateArray){
	                getoptions.setClientName(combo_workspaces.getText());
	                
	                if (changelistState.equalsIgnoreCase("Pending")){
	                	getoptions.setType(IChangelist.Type.PENDING);
	                } else if (changelistState.equalsIgnoreCase("Shelved")){
	                	getoptions.setType(IChangelist.Type.SHELVED);
	                } else if(changelistState.equalsIgnoreCase("Submitted")){
	                	getoptions.setType(IChangelist.Type.SUBMITTED);
	                }
	                	                
	                List<IChangelistSummary> changeLists = null;
					try {					
						changeLists = p4d.getChangelists(null, getoptions);
					} catch (P4JavaException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
	                //System.out.println(eachChangeSummary.getName() +" : "+eachChangeSummary.getDescription() );
	                    for(IChangelistSummary eachChangeList : changeLists){
	                    	
	                    	StringBuilder depotfiles = new StringBuilder();
	                    	changeListsArray.add(eachChangeList.getId());
	                    	changeListDescriptionsArray.add(eachChangeList.getDescription());
	                    	stateArray.add(changelistState);
	                    	System.out.println(eachChangeList.getId()+" - " + eachChangeList.getDescription());
	                    		
	                        IChangelist cinfo = null;
							try {
								cinfo = p4d.getChangelist(eachChangeList.getId());
							} catch (ConnectionException e3) {
								// TODO Auto-generated catch block
								e3.printStackTrace();
							} catch (RequestException e3) {
								// TODO Auto-generated catch block
								e3.printStackTrace();
							} catch (AccessException e3) {
								// TODO Auto-generated catch block
								e3.printStackTrace();
							}
	                        List<IFileSpec> filesList = null;
							try {
								filesList = cinfo.getFiles(true);
							} catch (ConnectionException e2) {
								// TODO Auto-generated catch block
								e2.printStackTrace();
							} catch (RequestException e2) {
								// TODO Auto-generated catch block
								e2.printStackTrace();
							} catch (AccessException e2) {
								// TODO Auto-generated catch block
								e2.printStackTrace();
							}
	                        try {
								filesList = p4d.getChangelistFiles(eachChangeList.getId());
							} catch (ConnectionException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							} catch (RequestException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							} catch (AccessException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
	                        for(IFileSpec eachFileSpec : filesList){
	                            System.out.println(eachFileSpec.getDepotPathString());
	                            String lineFeed = System.getProperty("line.separator");
	                            depotfiles = depotfiles.append(eachFileSpec.getDepotPathString() + lineFeed);
	                        }    
	                        fileListArray.add(depotfiles);
	                    }
	        	}
	        	
	        	
	            //This is to populate data in the table
	            for (int loopIndex = 0; loopIndex < changeListsArray.size(); loopIndex++) {
	              TableItem item = new TableItem(table, SWT.NULL);
	                           
	        	  TableEditor editor = new TableEditor (table);
	        	  Button checkButton = new Button(table, SWT.CHECK);
	        	  checkButton.pack();
	        	  editor.minimumWidth = checkButton.getSize ().x;
	        	  editor.horizontalAlignment = SWT.CENTER;
	        	  editor.setEditor(checkButton, item, 0);
	              
	              
	              item.setText(1, stateArray.get(loopIndex));
	              item.setText(2, changeListsArray.get(loopIndex).toString());
	              item.setText(3, fileListArray.get(loopIndex).toString());
	              item.setText(4, changeListDescriptionsArray.get(loopIndex));
	              //if (loopIndex % 2 == 0) item.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
	            }
	            
	            
	            for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
	                table.getColumn(loopIndex).pack();
	            }
	            
	            table.setRedraw(true);
	            
	            //clears the table
	            cleanList(changeListsArray, fileListArray, stateArray, changeListDescriptionsArray, table);
	            
	            //This is to sort the columns in the table
//	            Listener sortListener = new Listener() {
//	                public void handleEvent(Event e) {
//	                    TableItem[] items = table.getItems();
//	                    Collator collator = Collator.getInstance(Locale.getDefault());
//	                    TableColumn column = (TableColumn) e.widget;
//	                    int index = column == table.getColumn(0) ? 0 : 1;
//	                    for (int i = 1; i < items.length; i++) {
//	                        String value1 = items[i].getText(index);
//	                        for (int j = 0; j < i; j++) {
//	                            String value2 = items[j].getText(index);
//	                            if (collator.compare(value1, value2) < 0) {
//	                                String[] values = { items[i].getText(0),
//	                                        items[i].getText(1), items[i].getText(2),
//	                                        items[i].getText(3) };
//	                                items[i].dispose();
//	                                TableItem item = new TableItem(table, SWT.NONE, j);
//	                                item.setText(values);
//	                                items = table.getItems();
//	                                break;
//	                            }
//	                        }
//	                    }
//	                    table.setSortColumn(column);
//	                }
//	            };
//	            table.getColumn(0).addListener(SWT.Selection, sortListener);
//	            table.getColumn(1).addListener(SWT.Selection, sortListener);
//	            table.getColumn(2).addListener(SWT.Selection, sortListener);
//	            table.setSortColumn(table.getColumn(0));
//	            table.setSortDirection(SWT.TOP);
	            
	            table.setRedraw(true);
            }
          });

        
          
        Listener paintListener = new Listener() {
            public void handleEvent(Event event) {
              switch (event.type) {
              case SWT.MeasureItem: {
                TableItem item = (TableItem) event.item;
                String text = getText(item, event.index);
                Point size = event.gc.textExtent(text);
                event.width = size.x;
                event.height = Math.max(event.height, size.y);
                table.setRedraw(true);
                break;
              }
              case SWT.PaintItem: {
                TableItem item = (TableItem) event.item;
                String text = getText(item, event.index);
                Point size = event.gc.textExtent(text);
                int offset2 = event.index == 0 ? Math.max(0, (event.height - size.y) / 2) : 0;
                event.gc.drawText(text, event.x, event.y + offset2, true);
                table.setRedraw(true);
                break;
              }
              case SWT.EraseItem: {
                event.detail &= ~SWT.FOREGROUND;
                table.setRedraw(true);
                break;
              }
              }
            }

            String getText(TableItem item, int column) {
              String text = item.getText(column);
              if (column != 0) {
                int index = table.indexOf(item);
                if ((index + column) % 3 == 1) {
                  //text += "\nnew line";
                }
                if ((index + column) % 3 == 2) {
                  //text += "\nnew line\nnew line";
                }
              }
              table.setRedraw(true);
              return text;
            }
          };
        
        
        table.addListener(SWT.MeasureItem, paintListener);
        table.addListener(SWT.PaintItem, paintListener);
        table.addListener(SWT.EraseItem, paintListener);
        
        
        
        
        Button ok = new Button(shell, SWT.PUSH);
        ok.setText("Add files from this change list");
        ok.setLayoutData(data_submitted);
        ok.addSelectionListener(new SelectionAdapter() {
          public void widgetSelected(SelectionEvent event) {
            String changeList = text_submittedChangelist.toString();
            model.storeFileOrFolder(changeList);
            //populate changelist in the text box
            
            if (!text_submittedChangelist.getText().isEmpty()){
	            setChangelist(text_submittedChangelist.getText());
	            String changeListNumbers = changelistNum.replaceAll(",", "\r\n-c ");

	            //Replace multiple spaces with once space 
	            changeListNumbers = changeListNumbers.replaceAll(" +", " ");
	            populatechangelist("-c " + changeListNumbers + "\r\n");
	            shell.close();	
	            //disconnect from the Perforce server
	            disconnectFromServer(p4d);
            }else{
            	shell.close();
                //disconnect from the Perforce server
            	disconnectFromServer(p4d);
            }
          }
        });

        Button cancel = new Button(shell, SWT.PUSH);
        cancel.setText("Cancel");
        cancel.setLayoutData(data_submitted);
        cancel.addSelectionListener(new SelectionAdapter() {
          public void widgetSelected(SelectionEvent event) {
            shell.close();
          }
        });
        shell.setDefaultButton(ok);
        
    }
    
    public void disconnectFromServer(IOptionsServer p4d){
        //disconnect from the Perforce server
        try {
			p4d.disconnect();
		} catch (ConnectionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    public void setChangelist(String changelistNumber){        
        changelistNum = changelistNumber;
    }
    
    
    public void populatechangelist(String changeLists){
        if (Gui.txt.getText().isEmpty()){
            Gui.txt.setText(Gui.txt.getText() + changeLists);
        } else{
            Gui.txt.setText(Gui.txt.getText() + "\r\n" +  changeLists);
        }
    }
    

    public static void cleanList(List<Integer> changeListsArray, List<StringBuilder> fileListArray, List<String> stateArray, List<String> changeListDescriptionsArray, Table table){
    	changeListsArray.removeAll(changeListsArray);
    	fileListArray.removeAll(fileListArray);
    	stateArray.removeAll(stateArray);
    	changeListDescriptionsArray.removeAll(changeListDescriptionsArray);
    	table.setRedraw(true);
    }
    
}

Open in new window

0
 
LVL 36

Expert Comment

by:mccarl
ID: 39655538
Unfortunately, I haven't used any of these so I can't really comment on how to use them. I would say to have a go trying to get a small test example going first (outside of your current application) and if you run into any issues, post back here and we may be able to help. Then once you have that, it should be easy to integrate that into your current app.
0

Featured Post

The top UI technologies you need to be aware of

An important part of the job as a front-end developer is to stay up to date and in contact with new tools, trends and workflows. That’s why you cannot miss this upcoming webinar to explore the latest trends in UI technologies!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Whether you've completed a degree in computer sciences or you're a self-taught programmer, writing your first lines of code in the real world is always a challenge. Here are some of the most common pitfalls for new programmers.
In this post we will learn different types of Android Layout and some basics of an Android App.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
With the power of JIRA, there's an unlimited number of ways you can customize it, use it and benefit from it. With that in mind, there's bound to be things that I wasn't able to cover in this course. With this summary we'll look at some places to go…
Suggested Courses

704 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question