/*
* File : TextActivityBaseEditor.java
* Created : 10-oct-2002 15:40
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details (see the LICENSE file).
*/
package edu.xtec.jclic.activities.text;
import edu.xtec.jclic.ActivityEditor;
import edu.xtec.jclic.ActivityEditorPanel;
import edu.xtec.jclic.boxes.ActiveBagContentEditor;
import edu.xtec.jclic.boxes.ActiveBoxContent;
import edu.xtec.jclic.boxes.ActiveBoxContentEditor;
import edu.xtec.jclic.boxes.JPanelActiveBox;
import edu.xtec.util.Options;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyleConstants;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.29
*/
public class TextActivityBaseEditor extends ActivityEditor {
/** Creates a new instance of TextActivityBaseEditor */
public TextActivityBaseEditor(TextActivityBase act) {
super(act);
}
@Override
protected void createPanels(ActivityEditorPanel panel){
panel.addInternalPanel(ActivityEditorPanel.TEXT_BASE, null, null);
}
protected TextActivityBase getTextActivity(){
return (TextActivityBase)getActivity();
}
protected JPanelActiveBox createNewBox(int pos, Options options, Component parent){
JPanelActiveBox result=null;
TextActivityBase tab=getTextActivity();
AttributeSet a = tab.tad.getCharacterElement(pos).getAttributes();
if(a.isDefined(TextActivityDocument.TARGET)){
options.getMessages().showAlert(parent, "edit_text_act_err_cellInTarget");
return null;
}
ActiveBoxContent ab=new ActiveBoxContent();
ab.setDimension(new Dimension(100, 40));
ab.setBoxBase(tab.tad.boxesContent.bb);
ab=ActiveBoxContentEditor.getActiveBoxContent(ab, parent, options, getMediaBagEditor(), null);
if(ab!=null){
try{
result=TextActivityDocument.insertBox(ab, pos, tab.tad, tab, null);
} catch(Exception ex){
options.getMessages().showErrorWarning(parent, "ERROR", ex);
}
}
return result;
}
protected int from, to;
protected TargetMarker createNewTarget(int ifrom, int ito, Options options, Component parent){
TargetMarker tm=null;
TextActivityBase tab=getTextActivity();
if(tab!=null){
from=ifrom;
to=ito;
if(!checkTargetSegment(options, parent))
return null;
tm=new TargetMarker(tab.tad);
tm.begOffset=from;
tm.endOffset=to;
tm.setPositions();
tab.tad.tmb.add(tm);
tab.tad.applyStyleToTarget(tm, TextActivityDocument.TARGET, false, true);
}
return tm;
}
private boolean checkTargetSegment(Options options, Component parent){
String errMsg=null;
if(getTextActivity()==null)
return false;
TextActivityDocument tad=getTextActivity().tad;
String text;
try{
text=tad.getText(0, tad.getLength());
} catch(Exception ex){
return false;
}
int len=text.length();
from=Math.min(Math.max(0, from), Math.max(0, len-1));
to=Math.min(Math.max(from, to), len);
switch(tad.getTargetType()){
case TextActivityDocument.TT_FREE:
int fromBk=from;
int toBk=to;
while(from<len && Character.isWhitespace(text.charAt(from)))
from++;
while(to>=from && to>0 && Character.isWhitespace(text.charAt(to-1)))
to--;
if(from>=to){
from=fromBk;
to=toBk;
}
break;
case TextActivityDocument.TT_CHAR:
while(from<len && Character.isWhitespace(text.charAt(from)))
from++;
to=Math.min(from+1, len);
break;
case TextActivityDocument.TT_WORD:
while(from>=0 && !Character.isWhitespace(text.charAt(from)))
from--;
from++;
to=from;
while(to<len && !Character.isWhitespace(text.charAt(to)))
to++;
break;
case TextActivityDocument.TT_PARAGRAPH:
javax.swing.text.Element element=tad.getParagraphElement(from);
if(element==null)
to=from;
else{
from=Math.max(0, element.getStartOffset());
to=Math.max(0, Math.min(text.length()-1, element.getEndOffset()-1));
while(to>from && (text.charAt(to)==0x0D || text.charAt(to)==0x0A))
to--;
to++;
}
break;
default:
break;
}
if(to==from)
errMsg="edit_text_act_err_noSelection";
else if(from>to)
errMsg="ERROR";
else {
try{
for(int i=from; i<to; i++){
char ch=tad.getText(i, 1).charAt(0);
if(ch==0x0D || ch==0x0A || ch==0x08){
errMsg="edit_text_act_err_badCharInSelection";
break;
}
AttributeSet a = tad.getCharacterElement(i).getAttributes();
if(a.isDefined(TextActivityDocument.TARGET)){
errMsg="edit_text_act_err_nestedTargets";
break;
}
if(a.getAttribute(StyleConstants.ComponentAttribute)!=null){
errMsg="edit_text_act_err_cellInTarget";
break;
}
}
} catch(BadLocationException ex){
}
}
if(errMsg!=null && options!=null)
options.getMessages().showAlert(parent, errMsg);
return errMsg==null;
}
protected boolean deleteTarget(TargetMarker tm, Options options, Component parent){
TextActivityBase tab=getTextActivity();
if(tab!=null){
tab.tad.tmb.remove(tm);
tab.tad.applyStyleToTarget(tm, null, false, true);
}
return true;
}
protected boolean canEditTarget(){
return false;
}
protected boolean editTarget(int pos, Options options, Component parent){
boolean result=false;
TextActivityBase tab=getTextActivity();
if(canEditTarget() && pos>=0 && pos<tab.tad.getLength()){
TargetMarker tm = tab.tad.tmb.getElementByOffset(pos, true);
if(tm!=null && tm.target!=null)
result=TextTargetEditorPanel.editTextTarget(tm.target, options, getMediaBagEditor(), parent);
if(result)
setModified(true);
}
return result;
}
protected void editCheckOptions(Options options, Component parent){
}
protected boolean hasType(){
return false;
}
protected boolean editType(Options options, Component parent){
return false;
}
public boolean nameChanged(int type, String oldName, String newName){
boolean result=super.nameChanged(type, oldName, newName);
result|=ActiveBagContentEditor.nameChanged(
getTextActivity().tad.boxesContent, type, oldName, newName);
result|=ActiveBagContentEditor.nameChanged(
getTextActivity().tad.popupsContent, type, oldName, newName);
if(result)
setModified(true);
return result;
}
}