/**
 *                                                                            
 * 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.preferences.ui.page;

import org.eclipse.osbp.preferences.IProductConfigurationPrefs;
import org.eclipse.osbp.preferences.Preference;
import org.eclipse.osbp.preferences.ui.component.APreferencePage;
import org.eclipse.osbp.preferences.ui.component.Item;
import org.eclipse.osbp.preferences.ui.component.Type;

public class PreferencePageBpmEngine extends APreferencePage {

	public PreferencePageBpmEngine() {
		super(
			"bpmEngine",
			"bpm engine"
		);
	}
	
	@Override
	protected Item[] initializeItems() {
		return new Item[] {
			new Item(Type.TEXT, Preference.SHOW_PRODUCT_CONFIGURATION, "Product Configuration", false),
			new Item(""),
			new Item("Bpm Engine Settings"),
			new Item(Type.SERVER,  Preference.BPM_ENGINE_SERVER, "Server Name or IP"),
			new Item(Type.INTEGER, Preference.BPM_ENGINE_PORT, "Port (default="+IProductConfigurationPrefs.DEFAULT_PORT_BPM_ENGINE+")"),
			new Item(Type.INTEGER, Preference.BPM_ENGINE_TIMEOUT, "Timeout in msec"),
			new Item("Hibernate Settings"),
			new Item(Type.TEXT,    Preference.BPM_ENGINE_HIBERNATE_SCHEMA_NAME, "Schema Name"),
			new Item(Type.BOOLEAN, Preference.BPM_ENGINE_HIBERNATE_SHOW_SQL, "Show SQL"),
			new Item(Type.BOOLEAN, Preference.BPM_ENGINE_HIBERNATE_FORMAT_SQL, "Format SQL"),
			new Item(Type.INTEGER, Preference.BPM_ENGINE_HIBERNATE_MAX_FETCH_DEPTH, "Max fetch depth"),
		};
	}
}
