/**
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.procedure.ui.editor.page;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.internal.text.html.HTMLTextPresenter;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.ITextHover;
import org.eclipse.jface.text.TextAttribute;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.presentation.PresentationReconciler;
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
import org.eclipse.jface.text.source.DefaultCharacterPairMatcher;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
import com.hundsun.ares.studio.biz.Parameter;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESModule;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.cres.extend.ui.text.CRESDocumentProvider;
import com.hundsun.ares.studio.cres.extend.ui.text.CRESScanner;
import com.hundsun.ares.studio.procdure.InternalParam;
import com.hundsun.ares.studio.procdure.ProcdureFactory;
import com.hundsun.ares.studio.procdure.Procedure;
import com.hundsun.ares.studio.procdure.constants.IProcedureResType;
import com.hundsun.ares.studio.procdure.provider.ProcedureUI;
import com.hundsun.ares.studio.procedure.ui.assistant.ProcedureTextAssistant;
import com.hundsun.ares.studio.ui.ARESColorManager;
import com.hundsun.ares.studio.ui.ARESUI;
import com.hundsun.ares.studio.ui.editor.EMFFormEditor;
import com.hundsun.ares.studio.ui.editor.text.ARESPartitionScanner;
import com.hundsun.ares.studio.ui.editor.text.ARESSourceViewerConfiguration;
import com.hundsun.ares.studio.ui.editor.text.GeneralSourceEditor;
import com.hundsun.ares.studio.ui.editor.text.NonRuleBasedDamagerRepairer;
import com.hundsun.ares.studio.ui.editor.textbase.TextBasedEditorInput;
/**
* @author qinyuan
*
*/
public class ProcedureTextEditor extends GeneralSourceEditor{
//private HSPairMatcher matcher = new HSPairMatcher(new char[] {'(', ')'});
DefaultCharacterPairMatcher defaultPairMatcher = new DefaultCharacterPairMatcher(new char[] {'(', ')', '{', '}', '[', ']'});
private static final String MATCH_PREF_KEY = "hs_matchbra";
private static final String MATCH_COLOR_KEY = "hs_match_color";
static {
IPreferenceStore store = ProcedureUI.getPlugin().getPreferenceStore();
store.setDefault(MATCH_PREF_KEY, true);
store.setValue(MATCH_PREF_KEY, true);
store.setDefault(MATCH_COLOR_KEY, StringConverter.asString(new RGB(192, 192, 192)));
store.setValue(MATCH_COLOR_KEY, StringConverter.asString(new RGB(192, 192, 192)));
}
private IARESResource aresResource;
private EMFFormEditor emfEditor;
private PseudoCodeListener listener = null;
/**
*
*/
public ProcedureTextEditor(IARESResource aresResource) {
super();
this.aresResource = aresResource;
}
@Override
protected void initializeKeyBindingScopes() {
setKeyBindingScopes(new String[] { "com.hundsun.ares.studio.ui.cres.context.source" }); //$NON-NLS-1$
}
@Override
public IDocumentProvider customGetDocumentProvider() {
return new CRESDocumentProvider();
}
@Override
public SourceViewerConfiguration getConfiguration() {
return new ProcedureSourceViewerConfiguration(this, getPreferenceStore());
}
protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) {
support.setCharacterPairMatcher(defaultPairMatcher);
support.setMatchingCharacterPainterPreferenceKeys(MATCH_PREF_KEY, MATCH_COLOR_KEY);
super.configureSourceViewerDecorationSupport(support);
//support.install(HSUIPlugin.getDefault().getPreferenceStore());
}
@Override
public void dispose() {
if(defaultPairMatcher != null) {
defaultPairMatcher.dispose();
}
if(listener==null){
listener = new PseudoCodeListener();
IEditorInput input = this.getEditorInput();
if(input instanceof TextBasedEditorInput){
IDocument document = getDocumentProvider().getDocument(input);
document.addDocumentListener(listener);
}
}
super.dispose();
}
public ISourceViewer getMySourceViewer() {
return getSourceViewer();
}
@Override
public Object getAdapter(Class c) {
if(c.equals(IARESResource.class)) {
return this.aresResource;
}else if(c.equals(EMFFormEditor.class)){
return this.emfEditor;
}
return super.getAdapter(c);
}
/**
* @param atomFunctionEditor
*/
public void setEditor(EMFFormEditor atomFunctionEditor) {
this.emfEditor = atomFunctionEditor;
if(listener==null){
listener = new PseudoCodeListener();
IEditorInput input = this.getEditorInput();
if(input instanceof TextBasedEditorInput){
IDocument document = getDocumentProvider().getDocument(input);
document.addDocumentListener(listener);
}
}
}
private String selectPseudoCode = "";
private CreateTemplateAction action;
//����Ҽ�����ģ�幦�ܰ���
protected void editorContextMenuAboutToShow(IMenuManager menu) {
super.editorContextMenuAboutToShow(menu);
menu.add(new Separator());
menu.add(getAction("createTemplateAction"));
selectPseudoCode = getSourceViewer().getTextWidget().getSelectionText();
if(StringUtils.isBlank(selectPseudoCode)){
action.setEnabled(false);
}else {
action.setEnabled(true);
}
}
protected void createActions() {
super.createActions();
action = new CreateTemplateAction();
action.setActionDefinitionId("com.hundsun.cdp.ui.createTemplateAction");
setAction("createTemplateAction", action);
}
/**
* ����α�����е��ı��仯
* @author liaogc
*
*/
private class PseudoCodeListener implements IDocumentListener{
@Override
public void documentAboutToBeChanged(DocumentEvent event) {
}
@Override
public void documentChanged(DocumentEvent event) {
String text = event.getDocument().get();
IEditorInput input = getEditorInput();
if(input instanceof TextBasedEditorInput){
((TextBasedEditorInput)input).getTextbased().setText(text);
}
}
}
class CreateTemplateActionNameValidator implements IInputValidator{
@Override
public String isValid(String newText) {
IARESResource res = aresResource.getModule().getARESResource(newText, IProcedureResType.PROCEDURE);
if(res != null && res.exists()) {
return("���� \"" + newText + " \"�Ѿ����ڣ�");
}
return null;
}
}
//�����Ҽ�����ģ�幦��
class CreateTemplateAction extends Action {
private IARESModule module;
private String name;
public CreateTemplateAction() {
setText("����ģ��");
}
@Override
public void run() {
InputDialog createTemplateDialog = new InputDialog(new Shell(),
"����ģ��","������ģ�����ƣ�","template_Proc_",new CreateTemplateActionNameValidator());
if(createTemplateDialog.open() == Window.OK) {
name = createTemplateDialog.getValue();
try {
createFunctionFiles();
} catch (ARESModelException e) {
e.printStackTrace();
MessageDialog.openError(new Shell(), "����ʧ��", e.getMessage());
}
}
}
//����ģ��ҳ��
private void createFunctionFiles() throws ARESModelException {
module = aresResource.getModule();
Procedure p = (Procedure) emfEditor.getInfo();
Procedure pro = ProcdureFactory.eINSTANCE.createProcedure();
List<Parameter> inputParam = (List<Parameter>) EcoreUtil.copyAll(p.getInputParameters());
List<Parameter> outputParam = (List<Parameter>) EcoreUtil.copyAll(p.getOutputParameters());
List<InternalParam> ivParam = (List<InternalParam>) EcoreUtil.copyAll(p.getInternalVariables());
pro.getInputParameters().addAll(inputParam);
pro.getOutputParameters().addAll(outputParam);
pro.getInternalVariables().addAll(ivParam);
pro.setPseudoCode(selectPseudoCode);
module.createResource(name + "." + IProcedureResType.PROCEDURE, pro);
}
}
}
class ProcedureSourceViewerConfiguration extends ARESSourceViewerConfiguration {
private IARESResource aresResource;
/**
* @param editor
* @param store
*/
public ProcedureSourceViewerConfiguration(GeneralSourceEditor editor,
IPreferenceStore store) {
super(editor, store);
}
@Override
public IHyperlinkDetector[] getHyperlinkDetectors(ISourceViewer sourceViewer) {
return new IHyperlinkDetector[]{new ProcedureHyperlinkDetector(editor)};
}
@Override
public String[] getDefaultPrefixes(ISourceViewer sourceViewer, String contentType) {
return new String[] { "--", "" };
}
@Override
public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
aresResource = (IARESResource) editor.getAdapter(IARESResource.class);
ContentAssistant assistant = new ContentAssistant();
assistant.setContentAssistProcessor(new ProcedureTextAssistant(aresResource), IDocument.DEFAULT_CONTENT_TYPE);
assistant.setContentAssistProcessor(new ProcedureTextAssistant(aresResource),IDocument.DEFAULT_CONTENT_TYPE);
assistant.enableAutoActivation(true);
assistant.enableAutoInsert(true);
assistant.setAutoActivationDelay(100);
assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
assistant.setContextInformationPopupBackground(ARESUI.getDefault().getColorManager().getColor(new RGB(0, 150, 0)));
assistant.setContextSelectorBackground(ARESUI.getDefault().getColorManager().getColor(new RGB(0, 150, 0)));
assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
return assistant;
}
@Override
public ITextHover getTextHover(ISourceViewer sourceViewer,
String contentType) {
return new ProcedureTextHover(aresResource.getARESProject());
}
/*
* @see SourceViewerConfiguration#getInformationControlCreator(ISourceViewer)
* @since 2.0
*/
public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) {
return new IInformationControlCreator() {
public IInformationControl createInformationControl(Shell parent) {
return new DefaultInformationControl(parent, new HTMLTextPresenter(false));
}
};
}
@Override
public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
return new String[] { IDocument.DEFAULT_CONTENT_TYPE, ARESPartitionScanner.HS_STRING,
ARESPartitionScanner.HS_COMMENT, ARESPartitionScanner.HS_CHARACTOR, ARESPartitionScanner.HS_MACRO};
}
@Override
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
PresentationReconciler reconciler = new PresentationReconciler();
DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new CRESScanner(colorManager));
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
NonRuleBasedDamagerRepairer commentRepairer = new NonRuleBasedDamagerRepairer(new TextAttribute(colorManager.getColor(ARESColorManager.COMMENT)));
reconciler.setDamager(commentRepairer, ARESPartitionScanner.HS_COMMENT);
reconciler.setRepairer(commentRepairer, ARESPartitionScanner.HS_COMMENT);
NonRuleBasedDamagerRepairer stringRepairer = new NonRuleBasedDamagerRepairer(new TextAttribute(colorManager.getColor(ARESColorManager.STRING)));
reconciler.setDamager(stringRepairer, ARESPartitionScanner.HS_STRING);
reconciler.setRepairer(stringRepairer, ARESPartitionScanner.HS_STRING);
NonRuleBasedDamagerRepairer macroRepairer = new NonRuleBasedDamagerRepairer(new TextAttribute(colorManager.getColor(ARESColorManager.BLUE)));
reconciler.setDamager(macroRepairer, ARESPartitionScanner.HS_MACRO);
reconciler.setRepairer(macroRepairer, ARESPartitionScanner.HS_MACRO);
// DefaultDamagerRepairer tagDr = new DefaultDamagerRepairer(new MacroScanner(colorManager));
// reconciler.setDamager(tagDr, ARESPartitionScanner.HS_MACRO);
// reconciler.setRepairer(tagDr, ARESPartitionScanner.HS_MACRO);
NonRuleBasedDamagerRepairer charactorRepairer = new NonRuleBasedDamagerRepairer(new TextAttribute(colorManager.getColor(ARESColorManager.CHARACTOR)));
reconciler.setDamager(charactorRepairer, ARESPartitionScanner.HS_CHARACTOR);
reconciler.setRepairer(charactorRepairer, ARESPartitionScanner.HS_CHARACTOR);
return reconciler;
}
}