version 1.246, 2009/09/02 16:09:21
|
version 1.247, 2009/09/03 15:19:35
|
Line 1067 ThotBool RepeatButtonClicked (NotifyElem
|
Line 1067 ThotBool RepeatButtonClicked (NotifyElem
|
if (Template_CanInsertRepeatChild (repeatEl)) |
if (Template_CanInsertRepeatChild (repeatEl)) |
{ |
{ |
firstEl = TtaGetFirstChild (repeatEl); |
firstEl = TtaGetFirstChild (repeatEl); |
listtypes = Template_GetListTypes (t, firstEl); |
if (firstEl) |
|
listtypes = Template_GetListTypes (t, firstEl); |
|
else |
|
listtypes = Template_GetListTypes (t, repeatEl); |
if (listtypes) |
if (listtypes) |
{ |
{ |
#ifdef TEMPLATE_DEBUG |
#ifdef TEMPLATE_DEBUG |
Line 1778 ThotBool TemplateElementWillBeDeleted (N
|
Line 1781 ThotBool TemplateElementWillBeDeleted (N
|
{ |
{ |
#ifdef TEMPLATES |
#ifdef TEMPLATES |
Document doc = event->document; |
Document doc = event->document; |
Element elem = event->element; |
Element el = event->element; |
Element xtElem, parent = NULL, sibling; |
Element xtEl, parent = NULL, sibling; |
ElementType xtType, elType; |
ElementType xtType, elType; |
char *type; |
|
Declaration dec; |
|
SSchema templateSSchema; |
SSchema templateSSchema; |
XTigerTemplate t; |
XTigerTemplate t; |
ThotBool selparent = FALSE; |
|
|
|
if (event->info==1) |
if (event->info==1) |
return FALSE; |
return FALSE; |
|
|
if (!TtaGetDocumentAccessMode(event->document)) |
if (!TtaGetDocumentAccessMode(doc)) |
return TRUE; |
return TRUE; |
|
if (!IsTemplateInstanceDocument (doc)) |
|
return FALSE; // If template or library, pass to specialized functions. |
|
|
templateSSchema = TtaGetSSchema ("Template", event->document); |
templateSSchema = TtaGetSSchema ("Template", doc); |
if (templateSSchema == NULL) |
if (templateSSchema == NULL) |
return FALSE; // let Thot do the job |
return FALSE; // let Thot do the job |
|
|
t = GetXTigerDocTemplate(doc); |
t = GetXTigerDocTemplate(doc); |
if (Template_IsTemplate(t)||Template_IsLibrary(t)) |
elType = TtaGetElementType (el); |
return FALSE; // If template or library, pass to specialized functions. |
xtEl = GetFirstTemplateParentElement (el); |
|
if (elType.ElSSchema == templateSSchema && |
xtElem = GetFirstTemplateParentElement(elem); |
(elType.ElTypeNum == Template_EL_repeat || |
if (xtElem) |
elType.ElTypeNum == Template_EL_bag)) |
|
{ |
|
// clean up the content of the bag or repeat |
|
sibling = TtaGetFirstChild (el); |
|
xtEl = el; |
|
TtaOpenUndoSequence (doc, el, el, 0, 0); |
|
while (sibling) |
|
{ |
|
el = sibling; |
|
TtaNextSibling (&sibling); |
|
TtaRegisterElementDelete (el, doc); |
|
TtaDeleteTree (el, doc); |
|
} |
|
if (elType.ElTypeNum == Template_EL_repeat) |
|
{ |
|
// regenerate the minimum of instances |
|
parent = GetParentLine (xtEl, templateSSchema); |
|
InstantiateRepeat (t, xtEl, doc, parent, TRUE); |
|
} |
|
TtaCloseUndoSequence (doc); |
|
TtaSelectElement (doc, xtEl); |
|
} |
|
else if (xtEl) |
{ |
{ |
xtType = TtaGetElementType(xtElem); |
xtType = TtaGetElementType (xtEl); |
if (xtType.ElTypeNum==Template_EL_bag) |
if (xtType.ElTypeNum==Template_EL_bag) |
|
return FALSE; // xt:bag always allow remove children. |
|
else |
{ |
{ |
elType = TtaGetElementType(elem); |
// look for the enclosing use |
if (elType.ElSSchema==templateSSchema && |
if (elType.ElSSchema != templateSSchema) |
(elType.ElTypeNum==Template_EL_useSimple || |
|
elType.ElTypeNum==Template_EL_useEl)) |
|
{ |
{ |
// Remove element manually. |
// check if the element is alone |
TtaOpenUndoSequence(doc, elem, elem, 0, 0); |
sibling = el; |
TtaRegisterElementDelete(elem, doc); |
TtaNextSibling (&sibling); |
TtaDeleteTree(elem, doc); |
while (sibling == NULL) |
TtaCloseUndoSequence(doc); |
{ |
return TRUE; |
// there is no next element |
|
sibling = el; |
|
TtaPreviousSibling (&sibling); |
|
if (parent == xtEl) |
|
break; |
|
if (sibling == NULL) |
|
{ |
|
el = parent; |
|
parent = TtaGetParent (el); |
|
sibling = el; |
|
TtaNextSibling (&sibling); |
|
} |
|
} |
|
if (sibling) |
|
return TRUE; // cannot delete |
} |
} |
else |
|
return FALSE; // xt:bag always allow remove children. |
xtEl = TtaGetParent (el); |
} |
xtType = TtaGetElementType (xtEl); |
else if (xtType.ElTypeNum == Template_EL_useSimple || |
if (xtType.ElSSchema == templateSSchema && |
xtType.ElTypeNum == Template_EL_useEl) |
(xtType.ElTypeNum == Template_EL_repeat || |
{ |
xtType.ElTypeNum == Template_EL_bag)) |
parent = TtaGetParent(elem); |
|
if (xtElem != parent) |
|
{ |
{ |
type = GetAttributeStringValueFromNum (xtElem, Template_ATTR_currentType, NULL); |
// delete the use within a bag or a repeat |
dec = Template_GetDeclaration(t, type); |
TtaOpenUndoSequence (doc, el, el, 0, 0); |
TtaFreeMemory (type); |
TtaRegisterElementDelete (el, doc); |
|
TtaDeleteTree (el, doc); |
if (dec && dec->nature == XmlElementNat) |
|
// Can remove only if the current type is a target element. |
|
return FALSE; |
|
else |
|
return TRUE; |
|
} |
} |
} |
if (xtType.ElTypeNum == Template_EL_repeat) |
else if (xtType.ElTypeNum == Template_EL_repeat) |
|
{ |
|
sibling = TtaGetSuccessor (elem); |
|
if (sibling == NULL) |
|
{ |
{ |
// there is no next element |
// regenerate the minimum of instances |
sibling = TtaGetPredecessor (elem); |
parent = GetParentLine (xtEl, templateSSchema); |
if (sibling == NULL) |
InstantiateRepeat (t, xtEl, doc, parent, TRUE); |
selparent = TRUE; |
|
} |
} |
TtaRegisterElementDelete (elem, doc); |
TtaCloseUndoSequence (doc); |
TtaDeleteTree (elem, doc); |
TtaSelectElement (doc, xtEl); |
parent = GetParentLine (xtElem, templateSSchema); |
|
InstantiateRepeat (t, xtElem, doc, parent, TRUE); |
|
if (selparent) |
|
// look for the new sibling |
|
sibling = TtaGetFirstChild (parent); |
|
if (sibling) |
|
TtaSelectElement(doc, sibling); |
|
else |
|
TtaSelectElement(doc, parent); |
|
return TRUE; |
|
} |
} |
} |
} |
|
return TRUE; // don't let thot do something |
//TODO Test if current element is use or repeat. |
|
// Because if an element is delete and it is the unique child of its parent, |
|
// the parent intends to destroy itself. |
|
|
|
return TRUE; |
|
#else /* TEMPLATES */ |
#else /* TEMPLATES */ |
return FALSE; |
return FALSE; |
#endif /* TEMPLATES */ |
#endif /* TEMPLATES */ |
Line 2471 void Template_ModifyUnionElement(Documen
|
Line 2482 void Template_ModifyUnionElement(Documen
|
XTigerTemplate t = GetXTigerDocTemplate(doc); |
XTigerTemplate t = GetXTigerDocTemplate(doc); |
SSchema sstempl = TtaGetSSchema ("Template", doc); |
SSchema sstempl = TtaGetSSchema ("Template", doc); |
ElementType unionType; |
ElementType unionType; |
char *proposed, *checked, *name, *types=NULL; |
char *proposed, *checked, *name, *types = NULL; |
|
|
if (doc && unionEl && t && sstempl) |
if (doc && unionEl && t && sstempl) |
{ |
{ |