/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License 2.0        
 * which accompanies this distribution, and is available at                  
 * https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 * SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.wizard.ui.allinonedsl;

import java.awt.Desktop;
import java.lang.management.ManagementFactory;
import java.lang.reflect.Method;
import java.net.URI;

import org.eclipse.osbp.wizard.ui.AllInOneDSLsNewProjectWizard;
import org.eclipse.osbp.wizard.ui.basic.BasicNewProjectWizardPage;
import org.eclipse.osbp.wizard.ui.basic.CommonProjectWizardTranslator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;

/**
 * The Class AllInOneDSLsNewProjectRuntimePage.
 * <br>
 * Displays the urls for the applications and provides clickable links.
 */
public class AllInOneDSLsNewProjectRuntimePage extends BasicNewProjectWizardPage {
	
	/**
	 * The listener interface for receiving webLink events.
	 * The class that is interested in processing a webLink
	 * event implements this interface, and the object created
	 * with that class is registered with a component using the
	 * component's <code>addWebLinkListener<code> method. When
	 * the webLink event occurs, that object's appropriate
	 * method is invoked.
	 *
	 * @see WebLinkEvent
	 */
	public class WebLinkListener implements Listener {

		/* (non-Javadoc)
		 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
		 */
		@Override
		public void handleEvent(Event event) {
			try {
				Desktop.getDesktop().browse(new URI(event.text));
			}
			catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * Instantiates a new all in one DS ls new project runtime page.
	 *
	 * @param wizard the wizard
	 * @param pageName the page name
	 */
	public AllInOneDSLsNewProjectRuntimePage(final AllInOneDSLsNewProjectWizard wizard, String pageName) {
		super(wizard, pageName);
	}
	
	@Override
    protected final void createProjectNameGroup(Composite parent) {
    	AllInOneDSLsNewProjectWizard wizard = (AllInOneDSLsNewProjectWizard) super.wizard;
        
        // new project label
    	int totalMemoryMB = (int)(Runtime.getRuntime().maxMemory() / (1024 * 1024));
    	int totalPhysicalMB = totalMemoryMB;
    	java.lang.management.OperatingSystemMXBean systemMxBean = ManagementFactory.getOperatingSystemMXBean();
    	try {
    		Class c = systemMxBean.getClass();
    		Method m = c.getDeclaredMethod("getTotalPhysicalMemorySize");
    		m.setAccessible(true);
    		Object l = m.invoke(systemMxBean);
    		if	(l instanceof Long) {
    			totalPhysicalMB = (int)(((Long)l) / (1024 * 1024)); 
    		}
    	}
    	catch (Exception e) {
    		e.printStackTrace();
    	}
    	wizard.projectInfo.setTotalPhysicalMemoryInMB(totalPhysicalMB);
    	
        Label totalMemoryLabel = new Label(projectGroup, SWT.NONE);
        totalMemoryLabel.setText(wizard.translator.getDocumentation(this,"labelTotalMemory"));
        		// IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
        totalMemoryLabel.setFont(parent.getFont());
        
        // new project name entry field
        Text totalMemory = new Text(projectGroup, SWT.BORDER);
        totalMemory.setLayoutData(data);
        totalMemory.setFont(parent.getFont());
        totalMemory.setEditable(false);
        totalMemory.setText(""+totalPhysicalMB);
        
        // new project label
        Label xmsSizeLabel = new Label(projectGroup, SWT.NONE);
        xmsSizeLabel.setText(wizard.translator.getDocumentation(this,"labelXmsSize"));
        		// IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
        xmsSizeLabel.setFont(parent.getFont());
        
        // new project name entry field
        wizard.xmsSize = new Text(projectGroup, SWT.BORDER);
        wizard.xmsSize.setLayoutData(data);
        wizard.xmsSize.setFont(parent.getFont());
        wizard.xmsSize.setEditable(true);
        wizard.xmsSize.setText(wizard.projectInfo.getXmsSizeInMB());
        
        // new project label
        Label xmxSizeLabel = new Label(projectGroup, SWT.NONE);
        xmxSizeLabel.setText(wizard.translator.getDocumentation(this,"labelXmxSize"));
        		// IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
        xmxSizeLabel.setFont(parent.getFont());
        
        // new project name entry field
        wizard.xmxSize = new Text(projectGroup, SWT.BORDER);
        wizard.xmxSize.setLayoutData(data);
        wizard.xmxSize.setFont(parent.getFont());
        wizard.xmxSize.setEditable(true);
        wizard.xmxSize.setText(wizard.projectInfo.getXmxSizeInMB());
        
        // new project label
        Label productPortNoLabel = new Label(projectGroup, SWT.NONE);
        productPortNoLabel.setText(wizard.translator.getDocumentation(this,"labelProductPortNo"));
        		// IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
        productPortNoLabel.setFont(parent.getFont());
        
        // new project name entry field
        wizard.productPortNo = new Text(projectGroup, SWT.BORDER);
        wizard.productPortNo.setLayoutData(data);
        wizard.productPortNo.setFont(parent.getFont());
        wizard.productPortNo.setEditable(true);
        wizard.productPortNo.setText(wizard.projectInfo.getProductPortNo());
        
        // new project label
        Label productDesktopUrlPathLabel = new Label(projectGroup, SWT.NONE);
        productDesktopUrlPathLabel.setText(wizard.translator.getDocumentation(this,"labelProductDesktopUrlPath"));
        		// IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
        productDesktopUrlPathLabel.setFont(parent.getFont());
        
        // new project name entry field
        wizard.productDesktopUrlPath = new Text(projectGroup, SWT.BORDER);
        wizard.productDesktopUrlPath.setLayoutData(data);
        wizard.productDesktopUrlPath.setFont(parent.getFont());
        wizard.productDesktopUrlPath.setEditable(true);
        wizard.productDesktopUrlPath.setText(wizard.projectInfo.getProductDesktopUrlPath());
        
        // new project label
        Label productMobileUrlPathLabel = new Label(projectGroup, SWT.NONE);
        productMobileUrlPathLabel.setText(wizard.translator.getDocumentation(this,"labelProductMobileUrlPath"));
        		// IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
        productMobileUrlPathLabel.setFont(parent.getFont());
        
        // new project name entry field
        wizard.productMobileUrlPath = new Text(projectGroup, SWT.BORDER);
        wizard.productMobileUrlPath.setLayoutData(data);
        wizard.productMobileUrlPath.setFont(parent.getFont());
        wizard.productMobileUrlPath.setEditable(false);
        wizard.productMobileUrlPath.setText(wizard.projectInfo.getProductMobileUrlPath());
        
        // new project label
        Label productLocalDesktopLink = new Label(projectGroup, SWT.NONE);
        productLocalDesktopLink.setText(wizard.translator.getDocumentation(this,"labelProductLocalDesktopLink"));
        		// IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
        productLocalDesktopLink.setFont(parent.getFont());
        
        // new project name entry field
        wizard.productLocalDesktopLink = new Link(projectGroup, SWT.NONE);
        wizard.productLocalDesktopLink.setLayoutData(data);
        wizard.productLocalDesktopLink.setFont(parent.getFont());
        wizard.productLocalDesktopLink.setText(wizard.projectInfo.getProductLocalDesktopLink());
        wizard.productLocalDesktopLink.addListener(SWT.Selection, new WebLinkListener());
        
        // new project label
        Label productLocalMobileLink = new Label(projectGroup, SWT.NONE);
        productLocalMobileLink.setText(wizard.translator.getDocumentation(this,"labelProductLocalMobileLink"));
        		// IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
        productLocalMobileLink.setFont(parent.getFont());
        
        // new project name entry field
        wizard.productLocalMobileLink = new Link(projectGroup, SWT.NONE);
        wizard.productLocalMobileLink.setLayoutData(data);
        wizard.productLocalMobileLink.setFont(parent.getFont());
        wizard.productLocalMobileLink.setText(wizard.projectInfo.getProductLocalMobileLink());
        wizard.productLocalMobileLink.addListener(SWT.Selection, new WebLinkListener());
    }
}
