/**
 *                                                                            
 * 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 v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.osgi.hybrid.api;

import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;

public interface IEventForNextRefresh {

	public class TryToAuthenticate implements IEventForNextRefresh {
		private final String fPortalId;
		private final String fUserName;
		private final String fPassword;
		
		protected TryToAuthenticate(String portalId, String userName, String password) {
			fPortalId = portalId;
			fUserName = userName;
			fPassword = password;
		}

		public String getPortalId() {
			return fPortalId;
		}

		public String getUserName() {
			return fUserName;
		}

		public String getPassword() {
			return fPassword;
		}
	}
	
	public final class FocusPerspective implements IEventForNextRefresh {
		private final String fSwitchingPerspective;
		
		protected FocusPerspective(String elementId) {
			fSwitchingPerspective = elementId;
		}

		public String getSwitchingPerspective() {
			return fSwitchingPerspective;
		}
	}
	
}
