troubleshooting Question

How to use gridlayout and griddata to design the UI?

Avatar of Tolgar
Tolgar asked on
Java
1 Comment1 Solution252 ViewsLast Modified:
Hi,
I am working on a UI and I am having hard time in using gridlayout and griddata in my code to position the progress bar.

Below is the code that I have and in this code, in the 3rd tab (//TAB3 CONTENT), I create a progress bar. But this bar is created on the left of the table. However, I would like to position the progress bar above the table and centered.

Can you please help me with that?

This is the Gui.java file:

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
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 org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;


public class Gui {
    
    static ToolItem item1;
    static ToolItem item11;
    static ToolItem item111;
    static ToolItem item1111;
    static ToolItem item12;
    static ToolItem item13;
    static ToolItem item23;
    static CTabFolder folder;
    static ToolItem item2;
    static ToolItem item22;
    static ToolItem item222;
    static ToolItem item3;
    static ToolItem item33;
    static ToolItem item333;
    static ToolItem item3333;
    static ToolItem item33333;
    static ToolItem item333333;
    static ToolItem item3333333;
    static ToolItem item33333333;
    static Text txt;

    
    private static ToolBarListener toolBarListener = new ToolBarListener();
    static RWFile rwFile = new RWFile();
    static FileTree fileTree = new FileTree();
    static StringBuilder buffer; 
    
    
    public static void swichTabChecks() {
        folder.setSelection(1);
    }
    public static void swichTabResults() {
        folder.setSelection(2);
    }
    public static void swichTabFiles() {
        folder.setSelection(0);
    } 
    public static void readTxt(String file) {
        buffer = new StringBuilder();
        buffer.append(txt.getText() + "\r\n" + rwFile.readFromFile(file));
        String fileList = buffer.toString();
        
        txt.setText(fileList);
    }    
    public static void writeTxt(String file) {
        rwFile.writeToFile(txt.getText(), file);
    }    
    public static void clearTxt() {
        txt.setText("");
        txt.setText("Use the buttons above to select files/directories, changelists, or saved file. Or you can type a list of fully-qualified names \n******************************************************************************************************************************\r\n");
    } 
    public static void selectFileFolders() {
        fileTree.main(null);
        buffer = new StringBuilder();
        buffer.append(txt.getText() + "\r\n" + fileTree.getFileFolders());
        //System.out.println("FILES:" + fileTree.getFileFolders());
        String fileList = buffer.toString();
        txt.setText(fileList);
    } 
    
    

    
    public static void main(String[] args) {
        Display display = new Display();
        final Shell shell = new Shell(display);
        
        toolBarListener.setShell(shell,display);
                  
        shell.setText("Development Desktop Tool");
        shell.setLayout(new GridLayout());
        folder = new CTabFolder(shell, SWT.TOP);
        GridData data = new GridData(SWT.FILL, GridData.FILL, true, true, 3, 3);
        folder.setLayoutData(data);
        CTabItem cTabItem1 = new CTabItem(folder, SWT.NONE);
        cTabItem1.setText("Files");
        CTabItem cTabItem2 = new CTabItem(folder, SWT.NONE);
        cTabItem2.setText("Checks");
        CTabItem cTabItem3 = new CTabItem(folder, SWT.NONE);
        cTabItem3.setText("Results");
       
     // -----------here starts TAB 1 -------------------- 
        Image image_Folder = new Image(display, "folder.png");
        Image image_shape_triangle = new Image(display, "shape_triangle.png");
        Image image_document = new Image(display, "document.png");
        Image image_delete = new Image(display, "delete.png");
        Image image_floppy_disk = new Image(display, "floppy_disk.png");
        Image image_navigate_right = new Image(display, "navigate_right.png");
       
        Composite compTab1 = new Composite(folder, SWT.NULL);
        GridLayout gridLayout1 = new GridLayout(3, false);
        compTab1.setLayout(gridLayout1);
        //compTab1.setLayoutData(new GridData());
        
        Composite compTB1 = new Composite(compTab1, SWT.NULL);
        GridLayout gL1 = new GridLayout(6, false);
        gL1.marginLeft = 0; gL1.marginRight = 0; gL1.horizontalSpacing = 0;
        compTB1.setLayout(gL1);
        GridData sepGD1 = new GridData(GridData.FILL_HORIZONTAL); sepGD1.horizontalSpan = 3; 
        compTB1.setLayoutData(sepGD1);
        compTB1.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_GRAY));
        
                
        //1st group
        CustomToolbar custToolBar1 = new CustomToolbar(compTB1, SWT.FLAT, "Files");
        
        item1 = new ToolItem(custToolBar1.getToolBar(), SWT.NONE);
        item1.setImage(image_Folder); item1.setText("Select Files/Directories"); item1.setToolTipText("Select the files or the directory you want to analyze");
        item1.addListener(SWT.Selection, toolBarListener);
        
        item11 = new ToolItem(custToolBar1.getToolBar(), SWT.PUSH);
        item11.setImage(image_shape_triangle); item11.setText("Select Changelist"); item11.setToolTipText("Select the files in the changelist");
        item11.addListener(SWT.Selection, toolBarListener);
                
        item111 = new ToolItem(custToolBar1.getToolBar(), SWT.PUSH);
        item111.setImage(image_document); item111.setText("Select File List"); item111.setToolTipText("Select the file list");
        item111.addListener(SWT.Selection, toolBarListener);
        
        item1111 = new ToolItem(custToolBar1.getToolBar(), SWT.PUSH);
        item1111.setImage(image_delete); item1111.setText("Clear List"); item1111.setToolTipText("Delete the list of all files below");
        item1111.addListener(SWT.Selection, toolBarListener);
        
        //This is the separator
        Label verticalSepartor11 = new Label(compTB1, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD11 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor11.setLayoutData(sepGD11); verticalSepartor11.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
        
        //2nd group
        CustomToolbar custToolBar11 = new CustomToolbar(compTB1, SWT.FLAT, "Configuration");
        
        item12 = new ToolItem(custToolBar11.getToolBar(), SWT.NONE);
        item12.setImage(image_floppy_disk); item12.setText("Save"); item12.setToolTipText("Save the list of files below to text file for future reference");
        item12.addListener(SWT.Selection, toolBarListener);    
        
        
        //This is the separator
        Label verticalSepartor12 = new Label(compTB1, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD12 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor12.setLayoutData(sepGD12); verticalSepartor12.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
       
        //3rd group
        CustomToolbar custToolBar111 = new CustomToolbar(compTB1, SWT.FLAT, "Next Actions");
        
        item13 = new ToolItem(custToolBar111.getToolBar(), SWT.NONE);
        item13.setImage(image_navigate_right); item13.setText("Specify Checks"); item13.setToolTipText("Move to the next tab to select the list of checks");
        item13.addListener(SWT.Selection, toolBarListener);
        
        //This is the separator
        Label verticalSepartor13 = new Label(compTB1, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD13 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor13.setLayoutData(sepGD13); verticalSepartor13.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
        
        
        Label horSepartorTab1 = new Label(compTab1, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.HORIZONTAL);
        GridData sepGridDataTab1 = new GridData(GridData.FILL_HORIZONTAL); sepGridDataTab1.horizontalSpan = 3; 
        horSepartorTab1.setLayoutData(sepGridDataTab1);horSepartorTab1.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
               
        Composite compButtons1 = new Composite(compTab1, SWT.NULL);
        FillLayout fillLayout1 = new FillLayout();
        fillLayout1.type = SWT.HORIZONTAL;                  
        compButtons1.setLayout(fillLayout1);
       
        cTabItem1.setControl(compTab1);
        
// -----------here starts TAB 2 --------------------              
        Image image_folder_document = new Image(display, "folder_document.png");
        Image image_selection_delete_2 = new Image(display, "selection_delete_2.png");

        Composite compTab2 = new Composite(folder, SWT.NULL);
        GridLayout gridLayout2 = new GridLayout(2, false);
        compTab2.setLayout(gridLayout2);
        
        Composite compTB2 = new Composite(compTab2, SWT.NULL);
        GridLayout gL2 = new GridLayout(4, false);
        gL2.marginLeft = 0; gL2.marginRight = 0; gL2.horizontalSpacing = 0;
        compTB2.setLayout(gL2);
        GridData sepGD2 = new GridData(GridData.FILL_HORIZONTAL); sepGD2.horizontalSpan = 2; 
        compTB2.setLayoutData(sepGD2);
        compTB2.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_GRAY));
        
        
        //1st group
        CustomToolbar custToolBar2 = new CustomToolbar(compTB2, SWT.FLAT, "Configuration");  
     
        item2 = new ToolItem(custToolBar2.getToolBar(), SWT.PUSH);
        item2.setImage(image_folder_document); item2.setText("Load saved check list"); item2.setToolTipText("Load the saved list of checks if you saved from previous runs");
        item22 = new ToolItem(custToolBar2.getToolBar(), SWT.PUSH);
        item22.setImage(image_selection_delete_2); item22.setText("Unselect all"); item22.setToolTipText("Unselec all checks below");
        item222 = new ToolItem(custToolBar2.getToolBar(), SWT.PUSH);
        item222.setImage(image_floppy_disk); item222.setText("Save selections"); item222.setToolTipText("Save the list of checks to a XML file for future reference");
        
        //This is the separator
        Label verticalSepartor21 = new Label(compTB2, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD21 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor21.setLayoutData(sepGD21); verticalSepartor21.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
        
            
        //2nd group
        CustomToolbar custToolBar22 = new CustomToolbar(compTB2, SWT.FLAT, "Next Actions");
                
        item23 = new ToolItem(custToolBar22.getToolBar(), SWT.PUSH);
        item23.setImage(image_navigate_right); item23.setText("Run checks"); item23.setToolTipText("Run the checks against the files you selected");
        item23.addListener(SWT.Selection, toolBarListener); 
              
        //This is the separator
        Label verticalSepartor22 = new Label(compTB2, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD22 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor22.setLayoutData(sepGD22); verticalSepartor22.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
        
        
        Label horSepartorTab2 = new Label(compTab2, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.HORIZONTAL);
        GridData sepGridDataTab2 = new GridData(GridData.FILL_HORIZONTAL); sepGridDataTab2.horizontalSpan = 3; 
        horSepartorTab2.setLayoutData(sepGridDataTab2);horSepartorTab2.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
               
        Composite compButtons2 = new Composite(compTab2, SWT.NULL);
        FillLayout fillLayout2 = new FillLayout();
        fillLayout2.type = SWT.HORIZONTAL;                  
        compButtons2.setLayout(fillLayout2);
       
        cTabItem2.setControl(compTab2);
     // -----------here starts TAB 3 --------------------      
        Image image_breakpoint = new Image(display, "breakpoint.png");
        Image image_redo = new Image(display, "redo.png");
        Image image_gecko = new Image(display, "gecko.png");
        Image image_navigate_left2 = new Image(display, "navigate_left2_orange.png");
        Image image_exit = new Image(display, "exit.png");
        
        Composite compTab3 = new Composite(folder, SWT.NULL);
        GridLayout gridLayout3 = new GridLayout(3, false);
        compTab3.setLayout(gridLayout3);
        
        Composite compTB3 = new Composite(compTab3, SWT.NULL);
        GridLayout gL3 = new GridLayout(11, false);
        gL3.marginLeft = 0; gL3.marginRight = 0; gL3.horizontalSpacing = 0;
        compTB3.setLayout(gL3);
        GridData sepGD3 = new GridData(GridData.FILL_HORIZONTAL); sepGD3.horizontalSpan = 5; 
        compTB3.setLayoutData(sepGD3);
        compTB3.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_GRAY));
 
       
        //1st group
        CustomToolbar custToolBar3 = new CustomToolbar(compTB3, SWT.FLAT, "Configuration");   
       
        item3 = new ToolItem(custToolBar3.getToolBar(), SWT.PUSH);
        item3.setImage(image_floppy_disk); item3.setText("Save"); item3.setToolTipText("Save the list of files and checks to a XML file for future reference");
        item3.addListener(SWT.Selection, toolBarListener);

        //This is the separator
        Label verticalSepartor31 = new Label(compTB3, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD31 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor31.setLayoutData(sepGD31); verticalSepartor31.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
        
        //2nd group
        CustomToolbar custToolBar33 = new CustomToolbar(compTB3, SWT.FLAT, "Processing");             
        
        item33 = new ToolItem(custToolBar33.getToolBar(), SWT.PUSH);
        item33.setImage(image_breakpoint); item33.setText("Stop checks"); item33.setToolTipText("Stop running the checks");
        item33.addListener(SWT.Selection, toolBarListener);
        
        item333 = new ToolItem(custToolBar33.getToolBar(), SWT.PUSH);
        item333.setImage(image_redo); item333.setText("Rerun failed"); item333.setToolTipText("Rerun failed checks");
        item333.addListener(SWT.Selection, toolBarListener);

        //This is the separator
        Label verticalSepartor32 = new Label(compTB3, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD32 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor32.setLayoutData(sepGD32); verticalSepartor32.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
       
        
        //3rd group       
        CSFilteringCheckBoxes checkBoxes = new CSFilteringCheckBoxes(compTB3, SWT.FLAT);
        
        //This is the separator
        Label verticalSepartor33 = new Label(compTB3, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD33 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor33.setLayoutData(sepGD33); verticalSepartor33.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
        
        
        //4th group
        CustomToolbar custToolBar3333 = new CustomToolbar(compTB3, SWT.FLAT, "Results");
        
        item33333 = new ToolItem(custToolBar3333.getToolBar(), SWT.PUSH);
        item33333.setImage(image_floppy_disk); item33333.setText("Save results"); item33333.setToolTipText("Save the results to HTML or XML file");
        item33333.addListener(SWT.Selection, toolBarListener);       
        item333333 = new ToolItem(custToolBar3333.getToolBar(), SWT.PUSH);
        item333333.setImage(image_gecko); item333333.setText("Save to geck"); item333333.setToolTipText("Save the results to a geck. Geck number will be asked when you click this button");
        item333333.addListener(SWT.Selection, toolBarListener);
      
        //This is the separator
        Label verticalSepartor34 = new Label(compTB3, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD34 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor34.setLayoutData(sepGD34); verticalSepartor34.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
        
               
        //5th group
        CustomToolbar custToolBar33333 = new CustomToolbar(compTB3, SWT.FLAT, "Next Actions");      
    
        item3333333 = new ToolItem(custToolBar33333.getToolBar(), SWT.PUSH);
        item3333333.setImage(image_navigate_left2); item3333333.setText("Start over"); item3333333.setToolTipText("Go back to the first tab to start over");
        item3333333.addListener(SWT.Selection, toolBarListener);
        item33333333 = new ToolItem(custToolBar33333.getToolBar(), SWT.PUSH);
        item33333333.setImage(image_exit); item33333333.setText("Quit"); item33333333.setToolTipText("Quit the tool");
        item33333333.addListener(SWT.Selection, toolBarListener);
        
        //This is the separator
        Label verticalSepartor35 = new Label(compTB3, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.VERTICAL);
        GridData sepGD35 = new GridData(GridData.FILL_VERTICAL);
        verticalSepartor35.setLayoutData(sepGD35); verticalSepartor35.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
                              
        
        Composite compButtons3 = new Composite(compTab3, SWT.NULL);
        FillLayout fillLayout3 = new FillLayout();
        fillLayout3.type = SWT.HORIZONTAL;                  
        compButtons3.setLayout(fillLayout3);
       
        cTabItem3.setControl(compTab3);
       

        //This is the separator between the toolbar and the text box.
        Label horSepartorTab3 = new Label(compTab3, SWT.SEPARATOR | SWT.SHADOW_NONE | SWT.HORIZONTAL);
        GridData sepGridDataTab3 = new GridData(GridData.FILL_HORIZONTAL); sepGridDataTab3.horizontalSpan = 5; 
        horSepartorTab3.setLayoutData(sepGridDataTab3);horSepartorTab3.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
        
        // -----------here ends ALL TAB MENUS -------------------- 
        
        //TAB1 CONTENT
        //This is the text box   
        GridLayout groupLayout = new GridLayout();
        GridData groupGD = new GridData(GridData.FILL_BOTH);
        Group groupText = new Group(compTab1, SWT.NONE);
        groupText.setLayout(groupLayout);
        groupText.setLayoutData(groupGD);
        groupText.setText("File List");
       
        GridData txtGridData = new GridData(GridData.FILL_BOTH);
        txt = new Text(groupText, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
        TxtFocusListener txtFL = new TxtFocusListener(compTab1);
        txt.setLayoutData(txtGridData);
        txt.addFocusListener(txtFL);
        txt.setText(TxtFocusListener.introText); txt.setForeground(compTab1.getDisplay().getSystemColor(SWT.COLOR_GRAY));
               
//#########################################################################################################################        
        
        //TAB2 CONTENT
        //This is the checks check box tree 
        GridData checksGridData2 = new GridData(GridData.FILL_BOTH);
        CheckListTree clt = new CheckListTree();
        clt.createCheckListTree(compTab2, checksGridData2);
 
//#########################################################################################################################
        
        //TAB3 CONTENT
        //This is the progress bar
        GridLayout progressBarGridLayout = new GridLayout();
        progressBarGridLayout.numColumns = 1;
        RunCheckProgressBar progressBar = new RunCheckProgressBar();
        GridData progressBarGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        progressBar.createProgressBar(compTab3, progressBarGridData);
        
        //This is the results table
        Table table = new Table(compTab3, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        //GridData resultsGridData = new GridData(1, 100, false, false);
        table.setLayout(progressBarGridLayout);
        table.setHeaderVisible(true);
        String[] titles = { "Override", "Rerun", "Check/Error", "Filename", "Line" };
        
        for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
            TableColumn column = new TableColumn(table, SWT.NULL);
            column.setText(titles[loopIndex]);
            column.setWidth(80);
        }
        
        for (int loopIndex = 0; loopIndex < 20; loopIndex++) {
            TableItem item = new TableItem(table, SWT.NULL);
            item.setText(0, "yes");
            item.setText(1, "0");
            item.setText(2, "Spellcheck");
            item.setText(3, "filename" + loopIndex);
            item.setText(4, "50" + loopIndex*4);
            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();
         }
          
         GridData data3 = new GridData(GridData.FILL_HORIZONTAL);
         data3.horizontalSpan = 2;
         table.setLayoutData(data3);
             
//########################################################################################################################
     
        shell.addShellListener(new ShellListener() {

            public void shellIconified(ShellEvent e) {
            }
            public void shellDeiconified(ShellEvent e) {
            }
            public void shellDeactivated(ShellEvent e) {
            }
            public void shellClosed(ShellEvent e) {
                System.out.println("Client Area: " + shell.getClientArea());
            }
            public void shellActivated(ShellEvent e) {
                int frameX = shell.getSize().x - shell.getClientArea().width;
                int frameY = shell.getSize().y - shell.getClientArea().height;
                shell.setSize(1200 + frameX, 1000 + frameY);
            }
        });
             
        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
} 

And this is the progress bar code (RunCheckProgressBar.java):

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;

public class RunCheckProgressBar {

    public void createProgressBar(Composite compTab3, GridData progressBarGridLayout) {

        final ProgressBar bar = new ProgressBar (compTab3, SWT.SMOOTH);
        bar.setLayoutData(progressBarGridLayout);
        Rectangle clientArea = compTab3.getClientArea ();
        bar.setBounds (clientArea.x, clientArea.y, 200, 16);
        
        
//        compTab3.timerExec(100, new Runnable() {
//            int i = 0;
//            public void run() {
//                if (bar.isDisposed()) return;
//                bar.setSelection(i++);
//                if (i <= bar.getMaximum()) display.timerExec(100, this);
//            }
//        });

    }
} 
Join the community to see this answer!
Join our exclusive community to see this answer & millions of others.
Unlock 1 Answer and 1 Comment.
Join the Community
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 1 Answer and 1 Comment.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros