/*******************************************************************************
 * Copyright (c) 2018 Red Hat and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Red Hat - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;


import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Bug138265_SystemMemoryUsage {

private Display display;
private Shell shell;
private Composite mainComposite;
private Color color;

public Bug138265_SystemMemoryUsage() {

display = new Display ();
shell = new Shell(display);
shell.setLayout(new GridLayout());

init();

shell.pack();
shell.open ();

}

private void init() {
mainComposite = new Composite(shell, SWT.NONE);
mainComposite.setLayoutData(getGridData());
mainComposite.setLayout(new GridLayout());

Composite buttonComposite = new Composite(mainComposite, SWT.NONE);
buttonComposite.setLayoutData(getGridData());
buttonComposite.setLayout(new GridLayout(2, true));

Button button = new Button(buttonComposite, SWT.PUSH);
button.setText("With setBackground");
GridData gridData = getGridData();
gridData.grabExcessVerticalSpace = false;
button.setLayoutData(gridData);

button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
createComposites(true);
}
});

Button button2 = new Button(buttonComposite, SWT.PUSH);
button2.setText("Without setBackground");
gridData = getGridData();
gridData.grabExcessVerticalSpace = false;
button2.setLayoutData(gridData);

button2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
createComposites(false);
}
});

color = new Color(display, new RGB(31,150,192));

}

private void createComposites(boolean colorise) {
for (int i = 0; i < 1500; i++) {
Composite composite = new Composite(mainComposite, SWT.BORDER);
if (colorise) {
composite.setBackground(color);
}
composite.setLayoutData(getGridData());
}
}

public void run() {
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep(); }
} display.dispose();
}

public GridData getGridData() {
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalAlignment = SWT.FILL;
gridData.verticalAlignment = SWT.FILL;
return gridData;
    }


public static void main(String[] args) {
Bug138265_SystemMemoryUsage swtMemoryTest = new Bug138265_SystemMemoryUsage();
swtMemoryTest.run();
}

}