package org.goko.tools.dro;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.commons.collections.CollectionUtils;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.Parameterization;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.e4.core.commands.ECommandService;
import org.eclipse.e4.core.commands.EHandlerService;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.FillLayout;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.ResourceManager;
import org.eclipse.wb.swt.SWTResourceManager;
import org.goko.common.GkUiComponent;
import org.goko.core.common.exception.GkException;
import org.goko.core.common.exception.GkTechnicalException;
import org.goko.core.controller.bean.MachineValueDefinition;
import org.goko.core.log.GkLog;
import org.goko.tools.dro.controller.DisplayReadOutController;
import org.goko.tools.dro.controller.DisplayReadOutModel;
import org.goko.tools.dro.preferences.DROPreferences;
/**
* DRO part
*
* @author PsyKo
*
*/
public class DisplayReadOut extends GkUiComponent<DisplayReadOutController, DisplayReadOutModel> implements IPropertyChangeListener{
/** LOG */
private static final GkLog LOG = GkLog.getLogger(DisplayReadOut.class);
private Composite parentComposite;
@Inject
private ECommandService commandService;
@Inject
private EHandlerService handlerService;
@Inject
public DisplayReadOut(IEclipseContext context) {
super(context, new DisplayReadOutController());
}
/**
* Create contents of the view part.
* @throws GkException GkException
*/
@PostConstruct
public void createControls(Composite parent) {
parent.setLayout(new FillLayout(SWT.HORIZONTAL));
this.parentComposite = new Composite(parent, SWT.NONE);
if(CollectionUtils.isEmpty(getDataModel().getObservedValuesDefinition())){
createEmptyPanel(parentComposite);
}else{
createFields(parentComposite);
}
DROPreferences.getInstance().addPropertyChangeListener(this);
}
private void createEmptyPanel(Composite parent){
parent.setLayout(new GridLayout(1, false));
Composite composite = new Composite(parent, SWT.WRAP);
composite.setLayout(new GridLayout(1, false));
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Label lblNoValueHere = new Label(composite, SWT.WRAP | SWT.CENTER);
lblNoValueHere.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1));
lblNoValueHere.setText("No value here ? You can configure the displayed values in the preferences.");
Button btnPreferences = new Button(composite, SWT.NONE);
btnPreferences.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1));
btnPreferences.setImage(ResourceManager.getPluginImage("org.goko.tools.dro", "icons/gear.png"));
btnPreferences.setText("Preferences");
btnPreferences.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
try {
Command cmd = commandService.getCommand("org.goko.tools.dro.command.dropreferences");
Parameterization param = new Parameterization(cmd.getParameter("goko.org.ui.page.id"), "org.goko.tools.dro.displayPreferences");
ParameterizedCommand pCmd = new ParameterizedCommand(cmd, new Parameterization[]{param});
if (handlerService.canExecute(pCmd)) {
handlerService.executeHandler(pCmd);
}
} catch (NotDefinedException e1) {
displayError(new GkTechnicalException(e1));
}
}
});
}
private void createFields(Composite composite){
composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
composite.setLayout(new GridLayout(2, false));
for(MachineValueDefinition definition : getDataModel().getObservedValuesDefinition()){
Label label = new Label(composite, SWT.NONE);
label.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
label.setFont(SWTResourceManager.getFont("Segoe UI", 13, SWT.BOLD));
label.setText(definition.getName());
Text valueTxt = new Text(composite, SWT.BORDER | SWT.RIGHT | SWT.READ_ONLY);
valueTxt.setText("--");
valueTxt.setFont(SWTResourceManager.getFont("Consolas", 14, SWT.BOLD));
GridData gridData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
gridData.grabExcessHorizontalSpace = true;
gridData.widthHint = 150;
valueTxt.setLayoutData(gridData );
getController().enableTextBindingOnValue(valueTxt, definition.getId());
}
}
/** (inheritDoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
if(parentComposite != null){
/*
* Recreate fields for data when settings changes
*/
try {
getController().updateDisplayedValues();
Composite parent = parentComposite.getParent();
parentComposite.dispose();
parentComposite = new Composite(parent, SWT.NONE);
createControls(parentComposite);
parent.setSize(parent.getSize());
parent.layout();
} catch (GkException e) {
LOG.error(e);
}
}
}
}