Show WikiEditorTab.java syntax highlighted
package fitEditor;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Vector;
import testResultView.TestResultView;
import testRunner.FitManager;
import treeView.TreeView;
import view.FitView;
import plugin.DeveloperCoordinator;
import plugin.FitClipsePlugin;
import plugin.ICoordinator;
import fitEditor.dialogs.projectlist.FileLabelProvider;
import fitEditor.dialogs.projectlist.FileTreeContentProvider;
import fitEditor.dialogs.table.TableAddDialog;
import fitEditor.dialogs.table.TableEditDialog;
import fitService.fitnesse.wikitext.WidgetBuilder;
import fitService.util.EditorConstants;
import fitService.util.Operation;
import fitService.util.WikiColumn;
import fitService.util.WikiRow;
import fitService.util.WikiTable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.window.Window;
import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
import connector.MaseSystem;
/**
* This class is responsible for controlling mase fit tests
*
* Contributor: Shu Xueling
*/
/**
* @author wilsonp
*
*/
public class WikiEditorTab
{
private TabCreator tabCreator;
private String agentEmail;
private ArrayList pages=new ArrayList();
private WikiTable editingTable;
private int tableInsPos;
private int selectionCount;
private StringBuffer pageContent=new StringBuffer();
private Text txtWikiPageContent;
private Text txtWikiPageName;
private Label lblWikiPageName;
private Label lblPagelist;
private Button btnLoadPage;
private Button btnSavePage;
private Button btnGenJavaClass;
private Button btnRunTest;
private Button btnViewOnServer;
private Combo pageList;
private Shell parentShell;
/**
* @param parent
*/
public WikiEditorTab(Composite parent,TabCreator tabCreator)
{
this.parentShell=parent.getShell();
this.addChildControls(parent);
//this.setMainView(view);
this.setTabCreator(tabCreator);
}
/**
* Run and wait for a close event
* @param shell Instance of Shell
*/
private void run(Shell shell)
{
Display display = shell.getDisplay();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
}
/**
* Release resources
*/
public void dispose()
{
}
/**
* Create a new shell, add the widgets, open the shell
*
*/
private void addChildControls(Composite parent)
{
// Create a composite to hold the children
btnViewOnServer = new Button(parent, SWT.PUSH | SWT.CENTER);
GridData gridData3 = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData3.widthHint = 120;
gridData3.heightHint = 20;
btnViewOnServer.setText("View on Server");
btnViewOnServer.setLayoutData(gridData3);
btnViewOnServer.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
if(!tabCreator.getLoginTab().checkLoginState()) return;
String pageName=txtWikiPageName.getText().trim();
MaseSystem mase=MaseSystem.getMaseSystem();
if(!mase.doesPageExist(pageName)){
MessageBox messageBox = new MessageBox(parentShell, SWT.ICON_QUESTION|SWT.YES|SWT.NO);
messageBox.setMessage("This page does not exist. Do you want to save it before view it on the server?");
messageBox.setText("View Page on Server?");
int response = messageBox.open();
switch(response){
case SWT.YES: saveWikiContentOnServer(pageName,txtWikiPageContent.getText().trim());break;
case SWT.NO: return;
}
}
refreshServerView();
tabCreator.showView(EditorConstants.SERVER_VIEWER_TAB);
}
});
GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_BOTH);
parent.setLayoutData (gridData);
GridLayout layout = new GridLayout(EditorConstants.FITEDITOR_WIDGETS_PER_ROW, false);
layout.marginWidth =EditorConstants.LAYOUT_MARGIN_WIDTH;
parent.setLayout (layout);
// Add editing buttons
Composite upperControlsParent=new Composite(parent,SWT.CENTER);
GridData gridData0 = new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_BOTH);
upperControlsParent.setLayoutData (gridData0);
GridLayout layout0 = new GridLayout(EditorConstants.FITEDITOR_WIDGETS_PER_ROW_1, true);
layout0.marginWidth =EditorConstants.LAYOUT_MARGIN_WIDTH;
layout0.horizontalSpacing=EditorConstants.LAYOUT_HORIZONTAL_SPACING;
upperControlsParent.setLayout (layout0);
createUpperControls(upperControlsParent);
// Create the editor
Composite editorParent=new Composite(parent,SWT.CENTER);
GridData gridData1 = new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_BOTH);
editorParent.setLayoutData (gridData1);
GridLayout layout1 = new GridLayout(EditorConstants.FITEDITOR_WIDGETS_PER_ROW, false);
layout1.marginWidth =EditorConstants.LAYOUT_MARGIN_WIDTH;
editorParent.setLayout (layout1);
this.createEditor(editorParent);
// Add the buttons
Composite lowerControlsParent=new Composite(parent,SWT.CENTER);
GridData gridData2 = new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_BOTH);
editorParent.setLayoutData (gridData2);
GridLayout layout2 = new GridLayout(EditorConstants.FITEDITOR_WIDGETS_PER_ROW_1, false);
layout2.marginWidth =EditorConstants.LAYOUT_MARGIN_WIDTH;
layout2.horizontalSpacing=EditorConstants.LAYOUT_HORIZONTAL_SPACING;
lowerControlsParent.setLayout (layout2);
createLowerControls(lowerControlsParent);
}
/**
* Add upper editing controls for this editor
* @param parent
*/
private void createUpperControls(Composite parent)
{
btnGenJavaClass = new Button(parent, SWT.PUSH | SWT.CENTER);
GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 120;
gridData.heightHint = 20;
btnGenJavaClass.setText("Generate Java Code");
btnGenJavaClass.setLayoutData(gridData);
btnGenJavaClass.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
if(!tabCreator.getLoginTab().checkLoginState()) return;
String destPath="";
//pop up a dialog,allowing users to select destination directory for java codes
IWorkspaceRoot iwr=FitClipsePlugin.getWorkspaceRoot();
final ElementTreeSelectionDialog dialog =
new ElementTreeSelectionDialog(parentShell,
new FileLabelProvider(),
new FileTreeContentProvider(true));
dialog.setAllowMultiple(false);
dialog.setTitle(EditorConstants.SAVE_DLG_TITLE);
dialog.setMessage(EditorConstants.SAVE_DLG_MSG);
dialog.setInput(iwr);
dialog.setValidator(new TypedElementSelectionValidator(
new Class[]{IFolder.class,IProject.class}, false));
if(dialog.open() == Window.OK) {
IResource rc = (IResource)dialog.getFirstResult();
if (rc != null)
{
//if(rc instanceof IFolder)
destPath=rc.getLocation().toString();//EditorConstants.PATH_WORKSPACE+rc.getFullPath().toString();
//if(rc instanceof IProject)
//destPath=EditorConstants.PATH_WORKSPACE+rc.getFullPath().toString();
// generate java code
tabCreator.getMainView().getFitClipseStub().getFitTranslator().parseWikiTablesToJavaCode(
txtWikiPageContent.getText().trim(),destPath+"\\");
}
}
}
});
}
/**
* Create the Table
*/
private void createEditor(Composite parent)
{
//add text editor
GridData gridData = new GridData (GridData.BEGINNING);
gridData.widthHint =parent.getShell().getBounds().width;
gridData.heightHint = parent.getShell().getBounds().height-280;
txtWikiPageContent=new Text(parent, SWT.BORDER|SWT.MULTI|SWT.WRAP);
txtWikiPageContent.setOrientation(SWT.V_SCROLL|SWT.H_SCROLL|SWT.LEFT_TO_RIGHT);
txtWikiPageContent.setLayoutData(gridData);
}
/**
* Add controls for wiki page operation
* @param parent the parent composite
*/
private void createLowerControls(Composite parent)
{
lblWikiPageName= new Label(parent, SWT.NONE);
txtWikiPageName = new Text(parent, SWT.BORDER);
lblPagelist= new Label(parent, SWT.NONE);
pageList = new Combo(parent, SWT.LEFT);
btnLoadPage = new Button(parent, SWT.PUSH | SWT.CENTER);
btnSavePage = new Button(parent, SWT.PUSH | SWT.CENTER);
GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 110;
lblWikiPageName.setText("Enter Wiki Page Name");
lblWikiPageName.setLayoutData(gridData);
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 280;
// read last MASE URL sucessfully used from local file
txtWikiPageName.setText("");
txtWikiPageName.setLayoutData(gridData);
gridData = new GridData (GridData.HORIZONTAL_ALIGN_FILL);
gridData.widthHint = 70;
lblPagelist.setText("Wiki Page List");
lblPagelist.setLayoutData(gridData);
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 120;
gridData.heightHint = 20;
pageList.setLayoutData(gridData);
pageList.setVisibleItemCount(20);
pageList.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
//when an item in page list is selected, put the page name into text field
String pagename=pageList.getItem(pageList.getSelectionIndex());
txtWikiPageName.setText(pagename);
}
});
// this.initPageList();
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 100;
gridData.heightHint = 20;
btnLoadPage.setText("Load Wiki Page");
btnLoadPage.setLayoutData(gridData);
btnLoadPage.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
loadWikiPage(txtWikiPageName.getText());
}
});
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 120;
gridData.heightHint = 20;
btnSavePage.setText("Save Wiki Page");
btnSavePage.setLayoutData(gridData);
//Changed by Chengyao & Patric
//change add method to MaseFit
btnSavePage.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
// if(!tabCreator.getLoginTab().checkLoginState()) return;
//
String wikipageName=txtWikiPageName.getText().trim();
// if (wikipageName!="")
// {
// MaseSystem mase = MaseSystem.getMaseSystem();
// if(mase==null){
// //TODO: add a popup "wrong server or not logged in
// return;
// }
String wikipageContent=null;
wikipageContent=txtWikiPageContent.getText().trim();
//
// if(wikipageContent!=null)
// {
//// boolean saveSuccess=tabCreator.getMainView().getFitClipseStub().getFitConnection().saveWikiPage(wikipageName,
//// wikipageContent,"");
// boolean saveSuccess=mase.saveFitPageText(wikipageName,wikipageContent);
//
// if(!saveSuccess)
// {
// MessageBox box=new MessageBox(parentShell,SWT.OK);
// box.setMessage(EditorConstants.SAVE_FAILURE_MESSAGE);
// box.open();
// }
// }
//
//
// }
saveWikiContentOnServer(wikipageName,wikipageContent);
//refresh the fit tree
ICoordinator coordinator=DeveloperCoordinator.getInstance();
TreeView tv = (TreeView)(coordinator.getView(TreeView.class));
if(tv != null){
tv.refreshView();
}
}
});
btnRunTest = new Button(parent, SWT.PUSH | SWT.CENTER);
GridData gridData2 = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData2.widthHint = 120;
gridData2.heightHint = 20;
btnRunTest.setText("Run as Fit Test");
btnRunTest.setLayoutData(gridData2);
btnRunTest.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
ICoordinator coordinator= DeveloperCoordinator.getInstance();
String Url="";
if(!tabCreator.getLoginTab().checkLoginState()) return;
String pageName = txtWikiPageName.getText().trim();
MaseSystem mase=MaseSystem.getMaseSystem();
if(!mase.doesPageExist(pageName)){
MessageBox messageBox = new MessageBox(parentShell, SWT.ICON_QUESTION|SWT.YES|SWT.NO);
messageBox.setMessage("This page does not exist. Do you want to save it before running the test?");
messageBox.setText("Save Page?");
int response = messageBox.open();
switch(response){
case SWT.YES: saveWikiContentOnServer(pageName,txtWikiPageContent.getText().trim());break;
case SWT.NO: return;
}
}
FitManager Fit = FitManager.getFitManager();
Url = Fit.getResultTestRoot()+ "\\" + pageName.substring(1) + ".html";
if(isWikiPageContentChanged()){
if(coordinator.isViewRegistered(FitView.class)){
FitView fv = null;
fv = (FitView)(coordinator.getView(FitView.class));
if(fv.yesNoMessageBox("Run Test Warning!","WARNING: " +
"Local version of test is out of sync with server. " +
"Do you want to save it first?")){
saveWikiContentOnServer(pageName,txtWikiPageContent.getText().trim());
}
// System.out.println("FItView Registered");
}
// System.out.println("Content Changed!1111111");
}
//end of remove
Fit.CreateTest(pageName);
Fit.runTests();
Fit.clearTests();
//trigger browser to refress
if(coordinator.isViewRegistered(TestResultView.class)){
TestResultView testResultView = null;
testResultView = (TestResultView)(coordinator.getView(TestResultView.class));
testResultView.refreshBrowser(Url);
}else{
//later load view
}
}
});
}
/**
* Return the parent composite
*/
public Control getControl() {
return null;//table.getParent();
}
private void setTabCreator(TabCreator tC){
this.tabCreator = tC;
}
/**
* @return Returns the agentEmail.
*/
public String getAgentEmail() {
return agentEmail;
}
/**
* @param agentEmail The agentEmail to set.
*/
public void setAgentEmail(String agentEmail) {
this.agentEmail = agentEmail;
}
/**
* read from file and put items in the combo box
*
*/
// public void initPageList()
// {
// File f=new File("c:/mase");
// File f1=new File("c:/mase/wikipages.log");
// if(f.exists() && f1.exists())
// {
// try
// {
// BufferedReader reader=
// new BufferedReader(new InputStreamReader
// (new FileInputStream(f1)));
//
// String pagename;
// pagename=reader.readLine();
// while(pagename!=null && pagename.trim()!="")
// {
// pageList.add(pagename);
// pagename=reader.readLine();
// }
//
// reader.close();
// }
// catch (FileNotFoundException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// catch (IOException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
//
// }
// }
//
// /**
// * Write items from the combo box "page list" to file
// *
// */
// public void savePageList()
// {
// File f=new File("c:/mase");
// if(!f.exists()) f.mkdir();
//
// if(f.exists())
// {
// try
// {
// FileWriter writer=
// new FileWriter("c:/mase/wikipages.log");
//
// String pagename;
// for(int i=0;i<pages.size();i++)
// {
// pagename=(String)pages.get(i);
// writer.write(pagename+System.getProperty("line.separator"));
// }
//
// writer.close();
// }
// catch (FileNotFoundException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// catch (IOException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }
// }
public String getWikiPageName() {
return txtWikiPageName.getText().trim();
}
/**
* add a new wikitable
* @param addDialogOpen
*/
public void addNewWikiTable(boolean addDialogOpen)
{
if(!addDialogOpen)
{
pageContent=new StringBuffer((txtWikiPageContent.getText().trim()));
// open 'add table' dialog
TableAddDialog dlgAddTable=new TableAddDialog(parentShell,this);
dlgAddTable.open();
}
else
{
//open 'edit table' dialog
TableEditDialog dlgEditTable=new TableEditDialog(parentShell,this);
dlgEditTable.open();
}
}
/**
* edit a new or existing wiki table
* @param editDialogOpen
*/
public void editWikiTable(boolean editDialogOpen)
{
if(!editDialogOpen)
{
pageContent=new StringBuffer((txtWikiPageContent.getText().trim()));
//get wikitable to be edited
Vector<WikiTable> tables=tabCreator.getMainView().getFitClipseStub().
getFitTranslator().generateWikiTable(pageContent.toString());
int insPos=getTableInsPos();
int tblDataStartPos=-1;
int tblDataEndPos=-1;
for(WikiTable table: tables)
{
tblDataStartPos=table.getTableDataStartPos();
tblDataEndPos=table.getTableDataEndPos();
if(tblDataStartPos!=-1 && tblDataEndPos!=-1 && tblDataStartPos!=tblDataEndPos &&
tblDataStartPos<=insPos && insPos<=tblDataEndPos)
{
this.setEditingTable(table);
this.setSelectionCount(table.getTableData().length());
break;
}
}
if(this.getEditingTable()==null) return;
//open 'edit table' dialog
TableEditDialog dlgEditTable=new TableEditDialog(parentShell,this);
dlgEditTable.open();
}
else
{
//generate wiki table text
WikiTable table=getEditingTable();
String wikiTableTxt=tabCreator.getMainView().getFitClipseStub().
getFitTranslator().generateWikiTableText(table);
//change wikitable text in wiki editor
pageContent.replace(table.getTableDataStartPos(),table.getTableDataEndPos(),wikiTableTxt);
txtWikiPageContent.setText(pageContent.toString().trim());
}
}
/**
* get currently edited table
* @return WikiTable
*/
public WikiTable getEditingTable() {
return editingTable;
}
/**
* set currently edited table
* @param editingTable
*/
public void setEditingTable(WikiTable editingTable) {
this.editingTable = editingTable;
}
/**
* @return String
*/
public Text getTxtWikiPageContent() {
return txtWikiPageContent;
}
/**
* @return int
*/
public int getSelectionCount() {
return selectionCount;
}
/**
* This method should refresh the tab with a different wiki page
*
* @param pageName
*/
public void loadWikiPage(String pageName){
// if(!tabCreator.getLoginTab().checkLoginState()) return;
txtWikiPageName.setText(pageName);
String wikipageName=pageName;
if (wikipageName!="" )
{
//added by Pat and Chengyao
//replaces the FitService Stub with a Mase Bean lookup
//Connecting to Mase bean
MaseSystem mase = MaseSystem.getMaseSystem();
if(mase==null){
//TODO: add a popup "wrong server or not logged in
return;
}
String wikipageContent= mase.getFitPageText(wikipageName);
if(wikipageContent!=null){
txtWikiPageContent.setText(wikipageContent);
}
else{
txtWikiPageContent.setText("");
}
//put page name into combo box 'pagelist' if this page is not there
String pagename=wikipageName;
if(!Arrays.asList(pageList.getItems()).contains(pagename))
{
pageList.add(pagename);
pageList.select(pageList.getItemCount()-1);
pages.add(pagename);
}
}
}
/**
* @param selectionCount
*/
public void setSelectionCount(int selectionCount) {
this.selectionCount = selectionCount;
}
/**
* @return int
*/
public int getTableInsPos() {
return tableInsPos;
}
/**
* @param tableInsPos
*/
public void setTableInsPos(int tableInsPos) {
this.tableInsPos = tableInsPos;
}
public boolean isWikiPageContentChanged(){
String wikipageName=txtWikiPageName.getText().trim();
System.out.println("the page name is: "+wikipageName+".");
if(wikipageName.equals(""))return false;
MaseSystem mase = MaseSystem.getMaseSystem();
// System.out.println("the mase instance is: "+mase);
String ServerWikipageContent= mase.getFitPageText(wikipageName).trim();
// System.out.println("the content server is "+ServerWikipageContent);
String LocalWikipageContent= txtWikiPageContent.getText().trim();
// if(mase==null){
// MessageBox box=new MessageBox(parentShell,SWT.OK);
// box.setMessage(EditorConstants.NOT_LOGIN_MESSAGE);
// box.open();
// return false ;
// }
// System.out.println("'"+ServerWikipageContent+"'");
// System.out.println("'"+LocalWikipageContent+"'");
return !(ServerWikipageContent.equals(LocalWikipageContent));
}
public void saveWikiContentOnServer(String pageName,String content){
if(!tabCreator.getLoginTab().checkLoginState()) return;
// String wikipageName=txtWikiPageName.getText().trim();
if (pageName!="")
{
MaseSystem mase = MaseSystem.getMaseSystem();
if(mase==null){
//TODO: add a popup "wrong server or not logged in
return;
}
if(content!=null)
{
// boolean saveSuccess=tabCreator.getMainView().getFitClipseStub().getFitConnection().saveWikiPage(wikipageName,
// wikipageContent,"");
boolean saveSuccess=mase.saveFitPageText(pageName,content);
if(!saveSuccess)
{
MessageBox box=new MessageBox(parentShell,SWT.OK);
box.setMessage(EditorConstants.SAVE_FAILURE_MESSAGE);
box.open();
}
}
}
}
public void refreshServerView(){
if(isWikiPageContentChanged()){
System.out.println("inside if content changed server refresh");
saveChangeMessageBox("Save?","The page named " + getWikiPageName() +
" in WikiEditor hase chagned. " +
"Do you want to view the test content on ServerViewer after saving the changes?");
}
else tabCreator.getServerViewerTab().refreshBrowser();
}
public void saveChangeMessageBox(String title, String message){
String pageName=tabCreator.getWikiEditorTab().getWikiPageName().trim();
Text content=tabCreator.getWikiEditorTab().getTxtWikiPageContent();
MessageBox messageBox = new MessageBox(parentShell, SWT.ICON_QUESTION|SWT.YES|SWT.NO|SWT.CANCEL);
messageBox.setMessage(message);
messageBox.setText(title);
int response = messageBox.open();
switch(response){
case SWT.YES: saveWikiContentOnServer(pageName,content.getText());break;
case SWT.NO: tabCreator.getServerViewerTab().refreshBrowser();
loadWikiPage(getWikiPageName());
break;
case SWT.CANCEL: break;
}
}
//TODO: add set the wikipage name
}
See more files for this project here