Solved

How to use layouts in JAVA SWT?

Posted on 2013-11-18
2
355 Views
Last Modified: 2013-11-19
Hi,
I am working on a GUI in Java SWT. This GUI has a dialog box and I have a problem in positioning the buttons in this dialog box.

Please see the code below that I simplified in order to make it easier to run on your system.

I will explain the change I am trying to make on the screenshot that I am sending in the attachment.

CODE

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.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.jface.viewers.TextCellEditor;


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

    public TEST(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");
        // {
			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, String userName){
                        
            //for getting all the workspaces
            //GetClientsOptions clientOptions = new GetClientsOptions(0, userName, null);
            //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) {
    	
    	//Connect to Perforce Server
    	//final IOptionsServer p4d = ServerFactory.getOptionsServer(
			//        ServerFactory.DEFAULT_PROTOCOL_NAME 
			  //      + "://" + "someserver", null);
			
			//p4d.setUserName("tolgar");			

			//p4d.connect();
        

        String userName = System.getProperty("user.name");
        //Get the workspace and changelist information from Perforce
        //List<IClientSummary> clientSummaryList = getAllPerforceWorkspaces(p4d, userName);
                
        shell.setLayout(new GridLayout(2, false));
        
       
//        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.horizontalAlignment = SWT.LEFT;
        data_workspace.verticalAlignment = SWT.TOP;
        data_workspace.grabExcessHorizontalSpace = true;
        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.LEFT;
        //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 | SWT.CHECK );
        TextCellEditor edit =new TextCellEditor(table,SWT.V_SCROLL);
        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();
            	table.setRedraw(true);
            	 
	        	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");
	                          //  if (eachFileSpec.getDepotPathString() != null){
	                            //	depotfiles = depotfiles.append(eachFileSpec.getDepotPathString() + lineFeed);
	                           // } else{
	                            //	depotfiles = depotfiles.append(eachFileSpec.getLocalPathString() + 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(1).addListener(SWT.Selection, sortListener);
	            table.getColumn(2).addListener(SWT.Selection, sortListener);
	            table.setSortColumn(table.getColumn(1));
	            table.setSortDirection(SWT.TOP);
	            
	            table.setRedraw(true);
            }
          });

        
          //This is for multi-line cell
//        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);
        
        
        //Get the checked changelists from the table
        table.addListener(SWT.Selection, new Listener()
        {
            @Override
            public void handleEvent(Event event)
            {
                if(event.detail == SWT.CHECK)
                {
                    TableItem current = (TableItem)event.item;
                    String lineFeed = System.getProperty("line.separator");
                    if(current.getChecked())
                    {                    	
                    	//changelistNum = changelistNum + ","+ current.getText(2) + " -" + current.getText(1).toLowerCase() + " -> " + current.getText(3).replace(lineFeed, "");
                    	changelistNum = changelistNum + "-c " + current.getText(2) + " -" + current.getText(1).toLowerCase() + " ### " + current.getText(3);
                        System.out.println(current.getText(2));
                    } else{
                    	String removeIt = "-c " + current.getText(2) + " -" + current.getText(1).toLowerCase() + " ### " + current.getText(3);
                    	changelistNum = changelistNum.replace(removeIt, "");
                    }
                }
            }
        });
        
        GridData okButton = new GridData();
        okButton.horizontalAlignment = SWT.FILL;
        okButton.grabExcessHorizontalSpace = true;
        Button ok = new Button(shell, SWT.PUSH);
        ok.setText("Add files from this change list");
        ok.setLayoutData(okButton);
        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()){
            if (!changelistNum.isEmpty()){
	            //setChangelist(text_submittedChangelist.getText());
            	//changelistNum = changelistNum + "," + text_submittedChangelist.getText();
            	//This is a temporary solution to remove the null in the beginning of the changelist
            	//changelistNum.replaceAll("null", "");
            	//String changeListNumbers = changelistNum.replaceAll(",", "\r\n-c ");

	            //Replace multiple spaces with once space 
	            //changeListNumbers = changeListNumbers.replaceAll(" +", " ");
	            
	            
	            //Get the checked changelists from the table

	            
            
	            //populatechangelist("-c " + changelistNum + "\r\n");
            	populatechangelist(changelistNum);
	            shell.close();	
	            //disconnect from the Perforce server
	            //disconnectFromServer(p4d);
	            changelistNum = "";
            }else{
            	shell.close();
                //disconnect from the Perforce server
            	//disconnectFromServer(p4d);
            }
          }
        });

        Button cancel = new Button(shell, SWT.PUSH);
        cancel.setText("Cancel");
        GridData cancelButton = new GridData();
        cancelButton.horizontalAlignment = SWT.FILL;
        cancelButton.grabExcessHorizontalSpace = true;
        cancel.setLayoutData(cancelButton);
        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

screenshot.png
0
Comment
Question by:Tolgar
2 Comments
 
LVL 35

Accepted Solution

by:
mccarl earned 500 total points
ID: 39658387
Ok, here goes...

Starting on line 132 of the above, change the number of columns from 2 to 1...
        shell.setLayout(new GridLayout(1, false));

Open in new window

Replace lines 142 - 148 with this...
        Composite workspaceComp = new Composite(shell, SWT.NONE);
        workspaceComp.setLayout(new RowLayout());
        
        Label label_workspace = new Label(workspaceComp, SWT.NONE);
        label_workspace.setText("Workspace:");

Open in new window

What we have done is that now there is an intermediate container, the Composite, that will hold both the label and the combobox. We tell the composite to be a child of the shell (it's just the one component now hence why we only need the number of columns of the GridLayout to be 1) and it has a RowLayout so the label and the combo will be together in a row.

Now also change lones 156 - 162 with this (so that the combobox is created as a child of the composite too, rather than a direct child of the shell)...
        final Combo combo_workspaces = new Combo(workspaceComp, SWT.READ_ONLY);
        combo_workspaces.setEnabled(true);

Open in new window

That should get the top part of the dialog as you want it, now on to the buttons down the bottom, although the idea is exactly the same...


Replace lines 460 - 465 with this...
        Composite buttonComp = new Composite(shell, SWT.NONE);
        buttonComp.setLayout(new RowLayout());
        
        Button ok = new Button(buttonComp, SWT.PUSH);
        ok.setText("Add files from this change list");

Open in new window

And replace lines 502 - 507 with this...
        Button cancel = new Button(buttonComp, SWT.PUSH);
        cancel.setText("Cancel");

Open in new window

Once all that is done correctly (pay attention to the exact line numbers that I have said, otherwise you might get compile errors) it should display as you want. Since there is only now 1 column in the GridLayout, you may be able to change that to a RowLayout(SWT.VERTICAL) or something else. If you stay with GridLayout, you can probably at least delete line 198 of the above, as your table now doesn't need to span columns (there is only 1 column), but I will leave that up to you!
0
 

Author Closing Comment

by:Tolgar
ID: 39659764
Perfect!!
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Introduction This article is the second of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers the basic installation and configuration of the test automation tools used by…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
Viewers will learn about if statements in Java and their use The if statement: The condition required to create an if statement: Variations of if statements: An example using if statements:
This tutorial will introduce the viewer to VisualVM for the Java platform application. This video explains an example program and covers the Overview, Monitor, and Heap Dump tabs.

707 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

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now