Justin
Justin

Reputation: 39

Having Two Composites inside of a ScrolledComposite

I am trying to create a legend and the way I would like to do it is have two separate composites, one on top of another inside of a scrolledComposite. the top composite children is another composite of a label and a canvas. This composite is filled from a properties file. The second composite is the same as the first with the children being the same kind of composites. How would I be able to achieve that. What the code below does is it while the file is being read, it makes the new composite and fills the main composite. I want the last three legend items be separate from the first ones and act as the first composite.

@Override
public void createPartControl(Composite parent)
{
  display = parent.getDisplay();
  parent.setLayout(new FillLayout());
  // This enables the display to be able to be scrollable when needed
  scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.BORDER);
  scrolledComposite.setExpandHorizontal(true);
  scrolledComposite.setExpandVertical(true);
  // making a new composite inside of the scrolledComposite to be to add labels and canvases
  stepComposite = new Composite(scrolledComposite, SWT.NONE);
  blockedComposite = new Composite(scrolledComposite, SWT.NONE);
  // making the layout for the composite a row so when the the children reach the end of the shell
  // the children will wrap down to the next level
  RowLayout layout = new RowLayout();
  layout.pack = false;
  layout.spacing = 5;
  stepComposite.setLayout(layout);
  blockedComposite.setLayout(layout);
}

/**
* Adding a new composite for a rectangle and label to be added to the legend
* @param legendMessage
*/
public static void addNewComposite(String legendMessage, int compositePosition)
{
  final String message = legendMessage;
  final String[] s = message.split(",");
  final int position = compositePosition;
  if (display != null)
  {
     display.syncExec(new Runnable()
     {
        @Override
        public void run()
        {
           Composite com;
          if (position == 1)
           {
               com = new Composite(blockedComposite, SWT.NONE);
           }
           else
           {
               com = new Composite(stepComposite, SWT.NONE);
           }
//               Composite com = new Composite(stepComposite, SWT.NONE);
           com.setLayout(new GridLayout(2, false));
           // Creating the color using the RBG values
           final Color color =
                 new Color(display, Integer.parseInt(s[0]), Integer.parseInt(s[1]), Integer.parseInt(s[2]));

           // Creating a canvas for which the rectangle can be drawn on
           Canvas canvas = new Canvas(com, SWT.NONE);
           canvas.setLayoutData(new GridData(50,40));
           // TODO Maybe set the bounds of the canvas
           canvas.addPaintListener(new PaintListener()
           {
              public void paintControl(PaintEvent e)
              {
                 e.gc.drawRectangle(1, 1, 48, 38);
                 e.gc.setBackground(color);
                 e.gc.fillRectangle(2, 2, 47, 37);
              }
           });

           // Creating a label and setting the font
           Label label = new Label(com, SWT.NULL);
           final Font boldFont = new Font(label.getDisplay(), new FontData("Arial", 12, SWT.BOLD));
           label.setFont(boldFont);
           label.setText(s[3]);

           // Adding a color and font disposer to the composite
           com.addDisposeListener(new DisposeListener()
           {
              public void widgetDisposed(DisposeEvent e)
              {
                 color.dispose();
                 boldFont.dispose();
              }
           });

           // Adding the composite into a map to be able to be deleted when model stops
           comps.put(s[3], com);
           if (position == 1)
           {
//                  scrolledComposite.setContent(blockedComposite);
//                  scrolledComposite.setMinSize(blockedComposite.computeSize(1, 1000));
           }
           else
           {
              scrolledComposite.setContent(stepComposite);
              scrolledComposite.setMinSize(stepComposite.computeSize(1, 1000));
           }
           // Adding the composite to the scrolledComposite to be able to appear
 //               scrolledComposite.setContent(stepComposite);
           // Setting the size of the scrolledComposite
 //               scrolledComposite.setMinSize(stepComposite.computeSize(1, 1000));
        }
     });
  }
}

this code replaces the first composite with the second composite and I would appreciate some new eyes to help me figure out the problem.

Upvotes: 0

Views: 365

Answers (1)

greg-449
greg-449

Reputation: 111142

ScrolledComposite only shows the Composite which you specify on setContent, you can't have multiple composites at that level.

Use one Composite as the direct child of ScrolledComposite and add your other composites as children of that single composite. Don't forget to set a Layout on all the composites.

Upvotes: 1

Related Questions