package LinGUIne.parts.advanced;
import javax.inject.Inject;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import LinGUIne.events.LinGUIneEvents;
import LinGUIne.extensions.IEditorSettings;
import LinGUIne.extensions.IProjectDataEditor;
import LinGUIne.extensions.IPropertiesProvider;
import LinGUIne.model.IProjectData;
import LinGUIne.model.Project;
import LinGUIne.model.TextData;
import LinGUIne.model.TextDataContents;
/**
* Simple editor for TextData objects.
*
* @author Kyle Mullins
*/
public class TextDataEditor implements IProjectDataEditor, IPropertiesProvider {
@Inject
private IEventBroker eventBroker;
private StyledText textArea;
private Composite propertiesView;
private Label lblCharCount;
private Label lblCharCountNoSpaces;
private Project parentProject;
private TextData projectData;
private TextDataContents projectDataContents;
private DirtyStateChangedListener dirtyListener;
private boolean isDirty;
@Override
public boolean canOpenData(IProjectData data, Project proj) {
return data instanceof TextData;
}
@Override
public boolean hasEditorSettings() {
return false;
}
@Override
public IEditorSettings getEditorSettings() {
return null;
}
/**
* Creates the editor area and hooks up listeners as needed.
*/
public void createComposite(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new GridLayout(1, false));
textArea = new StyledText(container, SWT.V_SCROLL | SWT.H_SCROLL);
textArea.setLayoutData(new GridData(GridData.FILL_BOTH));
textArea.setAlwaysShowScrollBars(true);
textArea.addModifyListener(new ModifyListener(){
@Override
public void modifyText(ModifyEvent e) {
if(!projectDataContents.getText().equals(textArea.getText())){
projectDataContents.setText(textArea.getText());
setDirty(true);
}
}
});
textArea.append(projectDataContents.getText());
createContextMenu(textArea);
}
@Override
public void setInputData(IProjectData data, Project parentProj) {
if(canOpenData(data, parentProj)){
projectData = (TextData)data;
projectDataContents = projectData.getContents();
parentProject = parentProj;
}
else{
throw new IllegalArgumentException("This class only supports "
+ "TextData objects.");
}
}
@Override
public IProjectData getInputProjectData(){
return projectData;
}
@Override
public Project getInputParentProject(){
return parentProject;
}
@Override
public void registerDirtyStateListener(DirtyStateChangedListener listener) {
dirtyListener = listener;
}
@Override
public boolean saveChanges() {
if(projectData.updateContents(projectDataContents)){
setDirty(false);
return true;
}
return false;
}
@Override
public String getPartLabel() {
return projectData.getName();
}
@Override
public String getPartIconURI(){
return null;
}
/**
* Sets the dirty state of the editor.
*/
public void setDirty(boolean dirty){
if(isDirty != dirty){
isDirty = dirty;
dirtyListener.dirtyChanged(isDirty);
}
}
@Override
public Composite getProperties(Composite parent) {
if(propertiesView == null){
createPropertiesView(parent);
}
return propertiesView;
}
/**
* Creates the properties Composite for this editor.
*/
private void createPropertiesView(Composite parent){
propertiesView = new Composite(parent, SWT.NONE);
propertiesView.setLayout(new GridLayout(1, false));
lblCharCount = new Label(propertiesView, SWT.NONE);
lblCharCount.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
lblCharCount.setText("Character count: ");
lblCharCountNoSpaces = new Label(propertiesView, SWT.NONE);
lblCharCountNoSpaces.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
lblCharCountNoSpaces.setText("Character count (no spaces): ");
updateProperties();
}
/**
* Updates the properties Composite based on the editor's contents.
*/
private void updateProperties(){
int charCount = textArea.getText().length();
int charCountNoSpaces = textArea.getText().replaceAll("\\s", "").length();
lblCharCount.setText("Character count: " + charCount);
lblCharCountNoSpaces.setText("Character count (no spaces): " +
charCountNoSpaces);
}
/**
* Creates the context menu for the editor.
*/
private void createContextMenu(Composite container){
final TextDataEditor self = this;
Menu contextMenu = new Menu(container);
container.setMenu(contextMenu);
MenuItem editAnnotationsItem = new MenuItem(contextMenu, SWT.NONE);
editAnnotationsItem.setText("Edit Annotations");
editAnnotationsItem.addSelectionListener(new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent e) {
eventBroker.post(LinGUIneEvents.UILifeCycle.EDIT_ANNOTATIONS,
self);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
MenuItem selectAllItem = new MenuItem(contextMenu, SWT.NONE);
selectAllItem.setText("Select All");
selectAllItem.addSelectionListener(new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent e) {
textArea.setSelection(0, textArea.getText().length());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
}
}