package com.iambookmaster.client.importer;
import java.util.ArrayList;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusListener;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.SourcesTabEvents;
import com.google.gwt.user.client.ui.TabListener;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.iambookmaster.client.Images;
import com.iambookmaster.client.Styles;
import com.iambookmaster.client.beans.Paragraph;
import com.iambookmaster.client.beans.ParagraphConnection;
import com.iambookmaster.client.common.CompactHorizontalPanel;
import com.iambookmaster.client.common.NumberTextBox;
import com.iambookmaster.client.common.ResizeListener;
import com.iambookmaster.client.common.ScrollContainer;
import com.iambookmaster.client.common.SpanLabel;
import com.iambookmaster.client.common.TrueVerticalSplitPanel;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppLocale;
import com.iambookmaster.client.locale.AppMessages;
import com.iambookmaster.client.model.Model;
/**
* Panel for import other books
* @author ggadyatskiy
*/
public abstract class ImportTextPanel extends PopupPanel{
private static final String STYLE_TYPE_SELECTED = "import_par_type_sel";
private static final String STYLE_TYPE_UNSELECTED = "import_par_type_unsel";
private static final int TAB_ORIGINAL = 0;
private static final int TAB_OPTIONS = 1;
private static final int TAB_PARAGRAPHS = 2;
private static final int TAB_CONNECTIONS = 3;
private static final AppConstants appConstants = AppLocale.getAppConstants();
private static final AppMessages appMessages = AppLocale.getAppMessages();
private Button nextButton;
private Button prevButton;
private Button finishButton;
private Model model;
private StatusPanel statusPanel;
private TabPanel tabPanel;
private OriginalPanel originalPanel;
private TextBookImporter bookImporter;
private OptionsPanel optionsPanel;
private ParagraphsPanel paragraphsPanel;
private int visibleTab;
private ConnectionsPanel connectionsPanel;
private TrueVerticalSplitPanel splitPanel;
public ImportTextPanel() {
super();
setStyleName("exchangePanel");
VerticalPanel panel = new VerticalPanel();
panel.setSpacing(5);
panel.setSize("100%", "100%");
setWidget(panel);
Label title = new Label(appConstants.importPanelTitle());
panel.add(title);
panel.setCellWidth(title,"100%");
panel.setCellHeight(title,"1%");
bookImporter = new TextBookImporter(new TextBookImporterListener(){
public void error(String text) {
statusPanel.addError(text);
}
public void info(String text) {
statusPanel.addMessage(text, false);
}
public void warning(String text) {
statusPanel.addWarning(text);
}
public void endStage(String text) {
statusPanel.addMessage(text, true);
}
public void startStage(String text) {
statusPanel.addMessage(text, false);
}
public void startParseParagraph(Paragraph paragraph) {
connectionsPanel.nextParagraph(paragraph);
}
public void endParseParagraph(Paragraph paragraph) {
connectionsPanel.endParagraph(paragraph);
}
public void parseParagraphAddError(String text) {
connectionsPanel.addParagraphError(text);
}
public void parseParagraphAddLink(String link, Paragraph paragraph) {
connectionsPanel.addParagraphLink(link,paragraph);
}
public void parseParagraphAddText(String text) {
connectionsPanel.addParagraphText(text);
}
},appConstants,appMessages);
tabPanel = new TabPanel();
tabPanel.setSize("100%", "100%");
tabPanel.getDeckPanel().setSize("100%", "100%");
tabPanel.addTabListener(new TabListener() {
public boolean onBeforeTabSelected(SourcesTabEvents sender, int tabIndex) {
return true;
}
public void onTabSelected(SourcesTabEvents sender, int tabIndex) {
visibleTab = tabIndex;
prevButton.setEnabled(tabIndex>0);
nextButton.setEnabled(tabIndex<TAB_CONNECTIONS);
finishButton.setEnabled(false);
switch (visibleTab) {
case TAB_PARAGRAPHS:
if (originalPanel.isChanged() || optionsPanel.isChanged()) {
if (paragraphsPanel.isChanged()) {
if (Window.confirm(appConstants.importParseOriginalAgain())==false) {
return;
}
}
statusPanel.clear();
optionsPanel.applyParameters();
originalPanel.clearChanged();
optionsPanel.clearChanged();
model = new Model(AppLocale.getAppConstants(),AppLocale.getAppMessages());
model.getSettings().setShowParagraphNumbers(true);
bookImporter.importBook(model, originalPanel.getText());
paragraphsPanel.update(model);
}
paragraphsPanel.onActivate();
break;
case TAB_CONNECTIONS:
connectionsPanel.onActivate();
if (paragraphsPanel.isChanged()) {
if (connectionsPanel.isChanged()) {
if (Window.confirm(appConstants.importParseParagraphAgain())==false) {
return;
}
}
paragraphsPanel.clearChanged();
connectionsPanel.update(model);
finishButton.setEnabled(connectionsPanel.isHasParagraphs());
}
break;
case TAB_OPTIONS:
optionsPanel.onActivate();
break;
}
}
});
originalPanel = new OriginalPanel();
tabPanel.add(originalPanel, appConstants.importTabOriginal());
optionsPanel = new OptionsPanel();
tabPanel.add(optionsPanel, appConstants.importTabOptions());
paragraphsPanel = new ParagraphsPanel();
tabPanel.add(paragraphsPanel, appConstants.importTabParagraphs());
connectionsPanel = new ConnectionsPanel();
tabPanel.add(connectionsPanel, appConstants.importTabConnections());
splitPanel = new TrueVerticalSplitPanel(true,true);
splitPanel.addResizeListener(new ResizeListener(){
public void onResize(Widget panel) {
ImportTextPanel.this.onResize();
}
});
panel.add(splitPanel);
panel.setCellWidth(splitPanel,"100%");
panel.setCellHeight(splitPanel,"99%");
splitPanel.setTopWidget(tabPanel);
statusPanel = new StatusPanel();
splitPanel.setBottomWidget(statusPanel);
splitPanel.setSplitPosition("70%");
ClickListener listener = new ClickListener() {
public void onClick(Widget sender) {
if (sender==nextButton) {
if (visibleTab<TAB_CONNECTIONS) {
visibleTab++;
}
tabPanel.selectTab(visibleTab);
} else if (sender==prevButton) {
if (visibleTab>TAB_ORIGINAL) {
visibleTab--;
}
tabPanel.selectTab(visibleTab);
} else if (sender==finishButton) {
//trase numbers
bookImporter.traseMap();
if (applyImportedModel(model)) {
hide();
}
} else {
//cancel
hide();
}
}
};
HorizontalPanel horizontalPanel = new HorizontalPanel();
horizontalPanel.setSpacing(5);
horizontalPanel.setSize("100%", "100%");
prevButton = new Button(appConstants.buttonPrev(),listener);
prevButton.setEnabled(false);
horizontalPanel.add(prevButton);
horizontalPanel.setCellWidth(prevButton,"1%");
nextButton = new Button(appConstants.buttonNext(),listener);
horizontalPanel.add(nextButton);
horizontalPanel.setCellWidth(nextButton,"1%");
finishButton = new Button(appConstants.buttonFinish(),listener);
finishButton.setEnabled(false);
horizontalPanel.add(finishButton);
horizontalPanel.setCellWidth(finishButton,"1%");
HTML html = new HTML(" ");
horizontalPanel.add(html);
horizontalPanel.setCellWidth(html,"98%");
Button button = new Button(appConstants.buttonClose(),listener);
horizontalPanel.add(button);
horizontalPanel.setCellWidth(button,"1%");
panel.add(horizontalPanel);
panel.setCellWidth(horizontalPanel,"100%");
panel.setCellHeight(horizontalPanel,"1%");
tabPanel.selectTab(TAB_ORIGINAL);
}
public abstract boolean applyImportedModel(Model model);
public void onResize() {
switch (visibleTab) {
case TAB_PARAGRAPHS:
paragraphsPanel.resetHeight();
connectionsPanel.resizeOnActivate();
break;
case TAB_CONNECTIONS:
connectionsPanel.resetHeight();
paragraphsPanel.resizeOnActivate();
break;
case TAB_OPTIONS:
connectionsPanel.resizeOnActivate();
paragraphsPanel.resizeOnActivate();
break;
}
}
public void centerAndShow() {
int cw = Window.getClientWidth();
int w = cw -100;
if (w<400) {
w = 400;
}
int ch = Window.getClientHeight();
int h = ch-50;
if (h<300) {
h = 300;
}
setSize(String.valueOf(w)+"px", String.valueOf(h)+"px");
setPopupPosition((cw/2)-(w/2),(ch/2)-(h/2));
show();
splitPanel.activate();
}
public class OriginalPanel extends VerticalPanel implements ChangeListener{
private TextArea textArea;
private boolean changed;
public OriginalPanel() {
setSize("100%", "100%");
setSpacing(5);
Label title = new Label(appConstants.importTextTitle());
add(title);
setCellWidth(title,"100%");
setCellHeight(title,"1%");
textArea = new TextArea();
textArea.addChangeListener(this);
textArea.setSize("100%","100%");
add(textArea);
setCellWidth(textArea,"100%");
setCellHeight(textArea,"99%");
}
public String getText() {
return textArea.getText().trim();
}
public void onChange(Widget sender) {
changed = true;
}
public boolean isChanged() {
return changed;
}
public void clearChanged() {
changed = false;
}
}
public class OptionsPanel extends VerticalPanel implements ClickListener,ChangeListener{
private CheckBox paragraphNumberInSeparateLine;
private TextBox paragraphSeparator;
private TextBox paragraphReferenseStart;
private TextBox paragraphReferenseEnd;
private boolean changed;
private CheckBox detectSecreteNumbers;
private TextBox secretNumberStart;
private TextBox secretNumberEnd;
public OptionsPanel() {
paragraphNumberInSeparateLine = new CheckBox(appConstants.importNumberInSeparateLine());
paragraphNumberInSeparateLine.setChecked(bookImporter.isParagraphNumberInSeparateLine());
paragraphNumberInSeparateLine.addClickListener(this);
add(paragraphNumberInSeparateLine);
setCellWidth(paragraphNumberInSeparateLine,"100%");
setCellHeight(paragraphNumberInSeparateLine,"1%");
CompactHorizontalPanel widgetPanel = new CompactHorizontalPanel();
widgetPanel.addText("Paragraph number separator",false);
paragraphSeparator = new TextBox();
paragraphSeparator.addChangeListener(this);
paragraphSeparator.setText(String.valueOf(bookImporter.getParagraphNumberSeparator()));
paragraphSeparator.setMaxLength(1);
paragraphSeparator.setVisibleLength(2);
widgetPanel.addFullWidget(paragraphSeparator);
add(widgetPanel);
setCellWidth(widgetPanel,"100%");
setCellHeight(widgetPanel,"1%");
widgetPanel = new CompactHorizontalPanel();
widgetPanel.addText("In text",false);
paragraphReferenseStart = new TextBox();
paragraphReferenseStart.addChangeListener(this);
paragraphReferenseStart.setMaxLength(1);
paragraphReferenseStart.setText(String.valueOf(bookImporter.getParagraphReferenceStart()));
paragraphReferenseStart.setVisibleLength(2);
widgetPanel.addCompactWidget(paragraphReferenseStart);
widgetPanel.addText(appConstants.importParagraphReference(),false);
paragraphReferenseEnd = new TextBox();
paragraphReferenseEnd.addChangeListener(this);
paragraphReferenseEnd.setText(String.valueOf(bookImporter.getParagraphReferenceEnd()));
paragraphReferenseEnd.setMaxLength(1);
paragraphReferenseEnd.setVisibleLength(2);
widgetPanel.addFullWidget(paragraphReferenseEnd);
add(widgetPanel);
setCellWidth(widgetPanel,"100%");
setCellHeight(widgetPanel,"1%");
// widgetPanel = new CompactHorizontalPanel();
// detectSecreteNumbers = new CheckBox();
// detectSecreteNumbers.setValue(bookImporter.isSecretKeyDetection());
// widgetPanel.addCompactWidget(detectSecreteNumbers);
// widgetPanel.addText("Secret key detection. ",false);
// secretNumberStart = new TextBox();
// secretNumberStart.setMaxLength(1);
// secretNumberStart.setVisibleLength(2);
// secretNumberStart.setText(String.valueOf(bookImporter.getSecretKeyStart()));
// widgetPanel.addCompactWidget(secretNumberStart);
// widgetPanel.addText("key",false);
// secretNumberEnd = new TextBox();
// secretNumberEnd.setMaxLength(1);
// secretNumberEnd.setVisibleLength(2);
// secretNumberEnd.setText(String.valueOf(bookImporter.getSecretKeyEnd()));
// widgetPanel.addFullWidget(secretNumberEnd);
// add(widgetPanel);
// setCellWidth(widgetPanel,"100%");
// setCellHeight(widgetPanel,"1%");
//filler
HTML html = new HTML(" ");
add(html);
setCellWidth(html,"100%");
setCellHeight(html,"99%");
}
public boolean isChanged() {
return changed;
}
public void clearChanged() {
changed = false;
}
public void onActivate() {
}
public void applyParameters() {
bookImporter.setParagraphNumberInSeparateLine(paragraphNumberInSeparateLine.isChecked());
if (paragraphSeparator.getText().length()==0) {
bookImporter.setParagraphNumberSeparator(' ');
} else {
bookImporter.setParagraphNumberSeparator(paragraphSeparator.getText().charAt(0));
}
if (paragraphReferenseStart.getText().length()==0) {
bookImporter.setParagraphReferenceStart(' ');
} else {
bookImporter.setParagraphReferenceStart(paragraphReferenseStart.getText().charAt(0));
}
if (paragraphReferenseEnd.getText().length()==0) {
bookImporter.setParagraphReferenceEnd(' ');
} else {
bookImporter.setParagraphReferenceEnd(paragraphReferenseEnd.getText().charAt(0));
}
// bookImporter.setSecretKeyDetection(detectSecreteNumbers.isChecked());
// if (secretNumberStart.getText().length()==0) {
// bookImporter.setSecretKeyStart(' ');
// } else {
// bookImporter.setSecretKeyStart(secretNumberStart.getText().charAt(0));
// }
// if (secretNumberEnd.getText().length()==0) {
// bookImporter.setSecretKeyEnd(' ');
// } else {
// bookImporter.setSecretKeyEnd(secretNumberEnd.getText().charAt(0));
// }
}
public void onClick(Widget sender) {
changed = true;
}
public void onChange(Widget sender) {
changed = true;
}
}
public class StatusPanel extends VerticalPanel {
private boolean changed;
public StatusPanel(){
setSize("100%", "100%");
}
public void addFiller() {
HTML html = new HTML(" ");
add(html);
setCellWidth(html,"100%");
setCellHeight(html,"99%");
}
public void clearChanged() {
changed = false;
}
public boolean isChanged() {
return changed;
}
public void clear() {
changed = false;
super.clear();
}
public void addMessage(String text,boolean end) {
changed = true;
new Message(text,end);
}
public void addError(String text) {
changed = true;
new Message(text,Images.ERROR);
}
public void addWarning(String text) {
changed = true;
new Message(text,Images.WARNING);
}
public class Message extends HorizontalPanel{
private static final String STYLE = "validation_line";
private static final String STYLE_END = "validation_line_end";
private Image img;
private Label label;
public Message(String text, String image) {
setWidth("100%");
img = new Image(image);
img.setStyleName(STYLE);
add(img);
setCellWidth(img,"1%");
label = new Label(text);
label.setWidth("100%");
label.setStyleName(STYLE);
add(label);
setCellWidth(label,"99%");
StatusPanel.this.add(this);
StatusPanel.this.setCellWidth(this,"100%");
}
public Message(String text,boolean end) {
setWidth("100%");
label = new Label(text);
if (end) {
label.setStyleName(STYLE_END);
} else {
label.setStyleName(STYLE);
}
label.setWidth("100%");
add(label);
setCellWidth(label,"100%");
StatusPanel.this.add(this);
StatusPanel.this.setCellWidth(this,"100%");
}
}
}
public class ParagraphsPanel extends ScrollContainer {
private VerticalPanel panel;
private boolean activated;
private boolean changed;
public ParagraphsPanel() {
panel = new VerticalPanel();
panel.setSize("100%", "100%");
setScrollWidget(panel);
}
public void resizeOnActivate() {
activated = false;
}
public void clearChanged() {
changed = false;
}
public boolean isChanged() {
return changed;
}
public void update(Model model) {
panel.clear();
ArrayList<Paragraph> list = bookImporter.getParagraphs();
for (int i = 0; i < list.size(); i++) {
new Item(list.get(i));
}
HTML html = new HTML(" ");
panel.add(html);
panel.setCellWidth(html,"100%");
panel.setCellHeight(html,"99%");
changed = true;
}
public void onActivate() {
if (activated==false) {
activated = true;
resetHeight();
}
}
private void merge(Item item, boolean up) {
changed = true;
int pos = panel.getWidgetIndex(item);
String desc;
Item mrg;
if (up) {
if (pos==0) {
Window.alert(appConstants.importParagraphIsFirst());
return;
}
mrg = (Item)panel.getWidget(pos-1);
desc = mrg.paragraph.getDescription()+'\n'+item.paragraph.getDescription();
} else {
if (pos==panel.getWidgetCount()-2) {
Window.alert(appConstants.importParagraphIsLast());
return;
}
mrg = (Item)panel.getWidget(pos+1);
desc = item.paragraph.getDescription()+'\n'+mrg.paragraph.getDescription();
}
mrg.paragraph.setDescription(desc);
mrg.text.setText(desc);
panel.remove(pos);
}
private void split(Item item) {
changed = true;
int pos = panel.getWidgetIndex(item);
Paragraph paragraph = model.addNewParagraph(null);
paragraph.setName(item.paragraph.getName());
paragraph.setDescription(item.paragraph.getDescription());
paragraph.setNumber(item.paragraph.getNumber());
new Item(paragraph,pos);
}
public class Item extends Grid implements ChangeListener,ClickListener{
private NumberTextBox number;
private Label name;
private Label text;
private Paragraph paragraph;
private Image mergeUp;
private Image mergeDown;
private Image split;
public Item(Paragraph paragraph) {
this(paragraph,-1);
}
public Item(Paragraph paragraph, int before) {
super(2,2);
setStyleName("input_par_separator");
this.paragraph = paragraph;
getColumnFormatter().setStylePrimaryName(0,"1%");
getColumnFormatter().setStylePrimaryName(1,"99%");
getCellFormatter().setHeight(0,0, "1%");
getCellFormatter().setHeight(1,0, "99%");
getCellFormatter().setHeight(0,1, "1%");
getCellFormatter().setHeight(1,1, "99%");
setSize("100%", "100%");
number = new NumberTextBox();
number.setRange(0,9999);
number.setMaxLength(4);
number.setVisibleLength(4);
number.setValue(paragraph.getNumber());
number.setStyleName("input_par_num");
number.addChangeListener(this);
setWidget(0,0,number);
FlowPanel flowPanel = new FlowPanel();
flowPanel.setSize("100%", "100%");
//merge up
mergeUp = new Image(Images.UP_GREEN);
mergeUp.setStyleName(Styles.CLICKABLE);
mergeUp.addClickListener(this);
mergeUp.setTitle(appConstants.importMergePrevParagraph());
flowPanel.add(mergeUp);
//merge down
mergeDown = new Image(Images.DOWN_GREEN);
mergeDown.setStyleName(Styles.CLICKABLE);
mergeDown.addClickListener(this);
mergeDown.setTitle(appConstants.importMergeNextParagraph());
flowPanel.add(mergeDown);
//split
split = new Image(Images.SPLIT);
split.setStyleName(Styles.CLICKABLE);
split.addClickListener(this);
split.setTitle(appConstants.importSplitParagraph());
flowPanel.add(split);
setWidget(1,0,flowPanel);
name = new Label();
name.addStyleName(Styles.CLICKABLE);
name.setTitle(appConstants.importClickToEdit());
name.addClickListener(this);
name.setText(paragraph.getName());
setWidget(0,1,name);
text = new Label();
text.addStyleName(Styles.CLICKABLE);
text.setTitle(appConstants.importClickToEdit());
text.addClickListener(this);
applyText();
setWidget(1,1,text);
if (before<0) {
ParagraphsPanel.this.panel.add(this);
} else {
ParagraphsPanel.this.panel.insert(this,before);
}
ParagraphsPanel.this.panel.setCellWidth(this,"100%");
ParagraphsPanel.this.panel.setCellHeight(this,"1%");
}
private void applyText() {
text.setText(paragraph.getDescription());
}
public void onChange(Widget sender) {
if (sender==number) {
paragraph.setNumber(number.getIntegerValue());
changed = true;
}
}
public void onClick(Widget sender) {
if (sender==mergeUp) {
merge(this,true);
} else if (sender==mergeDown){
merge(this,false);
} else if (sender==split){
split(this);
} else if (sender==text) {
new EditArea();
} else if (sender==name) {
new EditText();
}
}
public class EditArea extends TextArea implements FocusListener {
public EditArea() {
int h = Item.this.text.getOffsetHeight();
if (h<30) {
h = 30;
}
setSize(String.valueOf(Item.this.text.getOffsetWidth())+"px", String.valueOf(h)+"px");
addFocusListener(this);
Item.this.setWidget(1,1,this);
setText(Item.this.paragraph.getDescription());
setFocus(true);
}
public void onFocus(Widget sender) {
}
public void onLostFocus(Widget sender) {
Item.this.setWidget(1,1,Item.this.text);
Item.this.paragraph.setDescription(getText().trim());
applyText();
changed = true;
}
}
public class EditText extends TextBox implements FocusListener {
public EditText() {
setSize(String.valueOf(Item.this.name.getOffsetWidth())+"px", String.valueOf(Item.this.name.getOffsetHeight())+"px");
addFocusListener(this);
Item.this.setWidget(0,1,this);
setText(Item.this.paragraph.getName());
setFocus(true);
}
public void onFocus(Widget sender) {
}
public void onLostFocus(Widget sender) {
Item.this.setWidget(0,1,Item.this.name);
Item.this.paragraph.setName(getText().trim());
Item.this.name.setText(Item.this.paragraph.getName());
changed = true;
}
}
}
}
public class ConnectionsPanel extends ScrollContainer {
private VerticalPanel panel;
private boolean activated;
private boolean changed;
private Item nextItem;
public ConnectionsPanel() {
panel = new VerticalPanel();
panel.setSize("100%", "100%");
setScrollWidget(panel);
}
public boolean isHasParagraphs() {
return panel.getWidgetCount()>1;
}
public void addParagraphText(String text) {
nextItem.addText(text);
}
public void addParagraphLink(String link, Paragraph paragraph) {
nextItem.addLink(link,paragraph);
}
public void addParagraphError(String text) {
nextItem.addError(text);
}
public void endParagraph(Paragraph paragraph) {
nextItem = null;
}
public void nextParagraph(Paragraph paragraph) {
nextItem = new Item(paragraph);
}
public void resizeOnActivate() {
activated = false;
}
public void update(Model model) {
statusPanel.clear();
bookImporter.parseParagraphsText();
int l = panel.getWidgetCount();
//regenerate
for (int i = 0; i < l; i++) {
Widget widget = panel.getWidget(i);
if (widget instanceof Item) {
Item item = (Item) widget;
item.applyType();
}
}
}
public void onActivate() {
if (activated==false) {
activated = true;
resetHeight();
}
}
public boolean isChanged() {
return changed;
}
public void cleanChanged() {
changed = false;
}
protected void selectParagraph(Paragraph paragraph) {
int l = panel.getWidgetCount();
for (int i = 0; i < l; i++) {
Widget widget = panel.getWidget(i);
if (widget instanceof Item) {
Item item = (Item) widget;
if (item.paragraph==paragraph) {
ensureVisible(item);
break;
}
}
}
}
public void clearOldStartParagraph(Paragraph oldStart) {
int l = panel.getWidgetCount();
for (int i = 0; i < l; i++) {
Widget widget = panel.getWidget(i);
if (widget instanceof Item) {
Item item = (Item) widget;
if (item.paragraph==oldStart) {
oldStart.setType(Paragraph.TYPE_NORMAL);
item.applyType();
break;
}
}
}
}
public class Item extends Grid implements ClickListener{
private Label number;
private Label name;
private FlowPanel text;
private Paragraph paragraph;
private NumberTextBox addNumber;
private Image add;
private Image normal;
private Image home;
private Image success;
private Image fail;
public Item(Paragraph paragraph) {
this(paragraph,-1);
}
public void addError(String error) {
Label label = new SpanLabel(error);
label.addStyleName("reader_error");
text.add(label);
}
public void addLink(String link, final Paragraph par) {
Link lnk = new Link(link,par,false);
text.add(lnk);
}
public void addText(String text) {
Label label = new SpanLabel(text);
this.text.add(label);
}
public Item(Paragraph paragraph, int before) {
super(2,2);
setStyleName("input_par_separator");
this.paragraph = paragraph;
getColumnFormatter().setStylePrimaryName(0,"1%");
getColumnFormatter().setStylePrimaryName(1,"99%");
getCellFormatter().setHeight(0,0, "1%");
getCellFormatter().setHeight(1,0, "99%");
getCellFormatter().setHeight(0,1, "1%");
getCellFormatter().setHeight(1,1, "99%");
setSize("100%", "100%");
number = new Label(String.valueOf(paragraph.getNumber()));
setWidget(0,0,number);
VerticalPanel panel = new VerticalPanel();
panel.setSize("100%", "100%");
HorizontalPanel horizontalPanel = new HorizontalPanel();
horizontalPanel.setSize("100%", "100%");
//add link contros
addNumber = new NumberTextBox();
addNumber.setRange(0, 9999);
addNumber.setVisibleLength(4);
addNumber.setTitle(appConstants.importTypeToAddConnections());
horizontalPanel.add(addNumber);
horizontalPanel.setCellWidth(addNumber, "1%");
add = new Image(Images.ADD_CONNECTION);
add.addStyleName(Styles.CLICKABLE);
add.setTitle(appConstants.importAddConnection());
add.addClickListener(this);
horizontalPanel.add(add);
horizontalPanel.setCellWidth(add, "99%");
panel.add(horizontalPanel);
panel.setCellHeight(horizontalPanel, "1%");
//type of paragraph
horizontalPanel = new HorizontalPanel();
horizontalPanel.setSize("100%", "100%");
normal = new Image(Images.LOCATION_NORMAL);
normal.setStyleName(STYLE_TYPE_SELECTED);
normal.addClickListener(this);
normal.setTitle(appConstants.importMakeNormal());
horizontalPanel.add(normal);
horizontalPanel.setCellWidth(normal, "1%");
home = new Image(Images.LOCATION_START);
home.setStyleName(STYLE_TYPE_UNSELECTED);
home.addClickListener(this);
home.setTitle(appConstants.importMakeStart());
horizontalPanel.add(home);
horizontalPanel.setCellWidth(home, "1%");
success = new Image(Images.LOCATION_SUCCESS);
success.setStyleName(STYLE_TYPE_UNSELECTED);
success.addClickListener(this);
success.setTitle(appConstants.importMakeSuccess());
horizontalPanel.add(success);
horizontalPanel.setCellWidth(success, "1%");
fail = new Image(Images.LOCATION_FAIL);
fail.setStyleName(STYLE_TYPE_UNSELECTED);
fail.addClickListener(this);
fail.setTitle(appConstants.importMakeFail());
horizontalPanel.add(fail);
horizontalPanel.setCellWidth(fail, "1%");
panel.add(horizontalPanel);
panel.setCellHeight(horizontalPanel, "99%");
applyType();
setWidget(1,0,panel);
name = new Label();
name.addStyleName(Styles.CLICKABLE);
name.setTitle(appConstants.importClickToEdit());
name.addClickListener(this);
name.setText(paragraph.getName());
setWidget(0,1,name);
text = new FlowPanel();
text.setStyleName("input_par");
text.setSize("100%", "100%");
setWidget(1,1,text);
ConnectionsPanel.this.panel.add(this);
ConnectionsPanel.this.panel.setCellWidth(this,"100%");
ConnectionsPanel.this.panel.setCellHeight(this,"1%");
}
public void onClick(Widget sender) {
if (sender==name) {
new EditName();
} else if (sender==add) {
addLink();
} else if (sender==normal) {
if (paragraph.getType()==Paragraph.TYPE_START) {
Window.alert(appConstants.importSelectOtherAsStart());
} else {
paragraph.setType(Paragraph.TYPE_NORMAL);
}
applyType();
} else if (sender==home) {
if (paragraph.getType()!=Paragraph.TYPE_START) {
Paragraph oldStart = model.getStartParagraph();
clearOldStartParagraph(oldStart);
model.makeParagraphAsStart(paragraph);
}
applyType();
} else if (sender==success) {
if (paragraph.getType()==Paragraph.TYPE_START) {
Window.alert(appConstants.importSelectOtherAsStart());
} else {
paragraph.setType(Paragraph.TYPE_SUCCESS);
}
applyType();
} else if (sender==fail) {
if (paragraph.getType()==Paragraph.TYPE_START) {
Window.alert(appConstants.importSelectOtherAsStart());
} else {
paragraph.setType(Paragraph.TYPE_FAIL);
}
applyType();
}
}
private void applyType() {
normal.setStyleName(STYLE_TYPE_UNSELECTED);
home.setStyleName(STYLE_TYPE_UNSELECTED);
success.setStyleName(STYLE_TYPE_UNSELECTED);
fail.setStyleName(STYLE_TYPE_UNSELECTED);
switch (paragraph.getType()) {
case Paragraph.TYPE_FAIL:
fail.setStyleName(STYLE_TYPE_SELECTED);
break;
case Paragraph.TYPE_START:
home.setStyleName(STYLE_TYPE_SELECTED);
break;
case Paragraph.TYPE_SUCCESS:
success.setStyleName(STYLE_TYPE_SELECTED);
break;
default:
//normal
normal.setStyleName(STYLE_TYPE_SELECTED);
}
}
private void addLink() {
int num = addNumber.getIntegerValue();
if (paragraph.getNumber()==num) {
Window.alert(appConstants.importCannotLinkToItself());
return;
}
ArrayList<Paragraph> list = model.getParagraphs();
for (int i = 0; i < list.size(); i++) {
Paragraph par = list.get(i);
if (par.getNumber()==num) {
//found
ArrayList<ParagraphConnection> conns = model.getParagraphConnections();
for (int j = 0; j < conns.size(); j++) {
ParagraphConnection connection = conns.get(i);
if (connection.getFrom()==paragraph && connection.getTo()==par) {
//already exists
Window.alert(appConstants.importConnectionExists());
return;
}
if (connection.getTo()==paragraph && connection.getFrom()==par) {
if (connection.isBothDirections()) {
Window.alert(appConstants.importConnectionExists());
} else if (Window.confirm(appConstants.importCretateBiConnection())) {
connection.setBothDirections(true);
}
return;
}
}
//no this connection
ParagraphConnection connection = new ParagraphConnection();
connection.setFrom(paragraph);
connection.setTo(par);
// connection.setFromId(Model.CONNECTION_ID_PREFIX+paragraph.getId());
// connection.setToId(Model.CONNECTION_ID_PREFIX+par.getId());
model.addParagraphConnection(connection, null);
Link link = new Link(Model.CONNECTION_DELIMETER_FROM+connection.getToId()+Model.CONNECTION_DELIMETER_TO,par,true);
text.add(link);
addNumber.setText("");
return;
}
}
Window.alert(appMessages.importUnknownParagraphNumber(num));
}
public void removeConnection(Link link) {
Paragraph to = link.paragraph;
if (Window.confirm(appMessages.importRemoveConnectionTo(to.getNumber()))) {
ArrayList<ParagraphConnection> list = model.getParagraphConnections();
for (int i = 0; i < list.size(); i++) {
ParagraphConnection connection = list.get(i);
if (connection.getFrom()==paragraph && connection.getTo()==to) {
list.remove(i);
if (link.manual) {
//remove it
text.remove(link);
} else {
//it is it text, just remove marks
link.linkRemoved();
}
return;
}
}
}
}
public class EditName extends TextBox implements FocusListener {
public EditName() {
setSize(String.valueOf(Item.this.name.getOffsetWidth())+"px", String.valueOf(Item.this.name.getOffsetHeight())+"px");
addFocusListener(this);
Item.this.setWidget(0,1,this);
setText(Item.this.paragraph.getName());
setFocus(true);
}
public void onFocus(Widget sender) {
}
public void onLostFocus(Widget sender) {
Item.this.setWidget(0,1,Item.this.name);
Item.this.paragraph.setName(getText().trim());
Item.this.name.setText(Item.this.paragraph.getName());
}
}
public class Link extends HorizontalPanel implements ClickListener{
private Label text;
private Image remove;
private Paragraph paragraph;
private boolean manual;
public Link(String link, Paragraph par, boolean manual) {
paragraph = par;
this.manual = manual;
text = new Label(link);
addStyleName("validator_par_marked");
addStyleName(Styles.CLICKABLE);
add(text);
DOM.setStyleAttribute(getElement(),"display","inline");
// setSize("100%", "100%");
remove = new Image(Images.REMOVE);
remove.setTitle(appConstants.importRemoveConnection());
add(remove);
remove.addClickListener(this);
text.addClickListener(this);
}
public void linkRemoved() {
removeStyleName("validator_par_marked");
removeStyleName(Styles.CLICKABLE);
text.removeClickListener(this);
remove(remove);
}
public void onClick(Widget sender) {
if (sender==text) {
selectParagraph(paragraph);
} else if (sender==remove) {
removeConnection(this);
}
}
}
}
}
}