You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

352 lines
9.7 KiB

  1. /**************************************************************************/
  2. /* EESchema */
  3. /* editexte.cpp: creation/ editions des textes (labels, textes sur schema) */
  4. /**************************************************************************/
  5. #include "fctsys.h"
  6. #include "gr_basic.h"
  7. #include "common.h"
  8. #include "program.h"
  9. #include "libcmp.h"
  10. #include "general.h"
  11. #include "protos.h"
  12. /* Fonctions locales */
  13. static void ShowWhileMoving(WinEDA_DrawPanel * panel, wxDC * DC, bool erase);
  14. static void ExitMoveTexte(WinEDA_DrawPanel * panel, wxDC *DC);
  15. /* Variables locales */
  16. static wxPoint ItemInitialPosition;
  17. static int OldOrient;
  18. static wxSize OldSize;
  19. static int s_DefaultShapeGLabel = (int) NET_INPUT;
  20. static int s_DefaultOrientGLabel = 0;
  21. /************************************/
  22. /* class WinEDA_LabelPropertiesFrame */
  23. /************************************/
  24. #include "dialog_edit_label.cpp"
  25. /****************************************************************************/
  26. void WinEDA_LabelPropertiesFrame::TextPropertiesAccept(wxCommandEvent& event)
  27. /****************************************************************************/
  28. {
  29. wxString text;
  30. int value;
  31. /* save old text in undo list if not already in edit */
  32. if ( m_CurrentText->m_Flags == 0 )
  33. m_Parent->SaveCopyInUndoList(m_CurrentText, IS_CHANGED);
  34. text = m_TextLabel->GetValue();
  35. if ( ! text.IsEmpty() ) m_CurrentText->m_Text = text;
  36. else if ( (m_CurrentText->m_Flags & IS_NEW) == 0 )
  37. DisplayError(this, _("Empty Text!") );
  38. m_CurrentText->m_Orient = m_TextOrient->GetSelection();
  39. text = m_TextSize->GetValue();
  40. value = ReturnValueFromString(g_UnitMetric, text, m_Parent->m_InternalUnits);
  41. m_CurrentText->m_Size.x = m_CurrentText->m_Size.y = value;
  42. if ( m_TextShape ) m_CurrentText->m_Shape = m_TextShape->GetSelection();
  43. m_Parent->GetScreen()->SetModify();
  44. /* Make the text size as new default size if it is a new text */
  45. if ( (m_CurrentText->m_Flags & IS_NEW) != 0 )
  46. g_DefaultTextLabelSize = m_CurrentText->m_Size.x;
  47. Close(TRUE);
  48. }
  49. /********************************************************************************/
  50. void WinEDA_SchematicFrame::StartMoveTexte(DrawTextStruct * TextStruct, wxDC *DC)
  51. /********************************************************************************/
  52. {
  53. if(TextStruct == NULL) return;
  54. g_ItemToRepeat = NULL;
  55. if ( (TextStruct->m_Flags & IS_NEW) == 0 )
  56. {
  57. delete g_ItemToUndoCopy;
  58. g_ItemToUndoCopy = TextStruct->GenCopy();
  59. }
  60. TextStruct->m_Flags |= IS_MOVED;
  61. switch( TextStruct->m_StructType )
  62. {
  63. case DRAW_LABEL_STRUCT_TYPE:
  64. case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
  65. case DRAW_TEXT_STRUCT_TYPE:
  66. ItemInitialPosition = TextStruct->m_Pos;
  67. OldSize = TextStruct->m_Size;
  68. OldOrient = TextStruct->m_Orient;
  69. break;
  70. default: break;
  71. }
  72. DrawPanel->CursorOff(DC);
  73. m_CurrentScreen->m_Curseur = ItemInitialPosition;
  74. DrawPanel->MouseToCursorSchema();
  75. GetScreen()->SetModify();
  76. DrawPanel->ManageCurseur = ShowWhileMoving;
  77. DrawPanel->ForceCloseManageCurseur = ExitMoveTexte;
  78. DrawPanel->ManageCurseur(DrawPanel, DC, TRUE);
  79. DrawPanel->CursorOn(DC);
  80. }
  81. /*************************************************************************/
  82. void WinEDA_SchematicFrame::EditSchematicText(DrawTextStruct * TextStruct,
  83. wxDC * DC)
  84. /*************************************************************************/
  85. /* Edit the properties of the text (Label, Gloab label, graphic text).. )
  86. pointed by "TextStruct"
  87. */
  88. {
  89. if(TextStruct == NULL) return;
  90. DrawPanel->CursorOff(DC);
  91. RedrawOneStruct(DrawPanel, DC, TextStruct, g_XorMode);
  92. WinEDA_LabelPropertiesFrame * frame = new WinEDA_LabelPropertiesFrame(this,
  93. TextStruct, wxPoint(30,30));
  94. frame->ShowModal(); frame->Destroy();
  95. RedrawOneStruct(DrawPanel, DC, TextStruct, GR_DEFAULT_DRAWMODE);
  96. DrawPanel->CursorOn(DC);
  97. }
  98. /***********************************************************************************/
  99. void WinEDA_SchematicFrame::ChangeTextOrient(DrawTextStruct * TextStruct, wxDC * DC)
  100. /***********************************************************************************/
  101. {
  102. if( TextStruct == NULL )
  103. TextStruct = (DrawTextStruct *) PickStruct(GetScreen()->m_Curseur,
  104. GetScreen()->EEDrawList, TEXTITEM|LABELITEM);
  105. if( TextStruct == NULL ) return;
  106. /* save old text in undo list if is not already in edit */
  107. if ( TextStruct->m_Flags == 0 )
  108. SaveCopyInUndoList(TextStruct, IS_CHANGED);
  109. /* Effacement du texte en cours */
  110. DrawPanel->CursorOff(DC);
  111. RedrawOneStruct(DrawPanel, DC, TextStruct, g_XorMode);
  112. /* Rotation du texte */
  113. switch( TextStruct->m_StructType )
  114. {
  115. case DRAW_LABEL_STRUCT_TYPE:
  116. case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
  117. case DRAW_TEXT_STRUCT_TYPE:
  118. ((DrawTextStruct*)TextStruct)->m_Orient++;
  119. ((DrawTextStruct*)TextStruct)->m_Orient &= 3;
  120. break;
  121. default: break;
  122. }
  123. GetScreen()->SetModify();
  124. /* Reaffichage */
  125. RedrawOneStruct(DrawPanel, DC, TextStruct, g_XorMode);
  126. DrawPanel->CursorOn(DC);
  127. }
  128. /*************************************************************************/
  129. EDA_BaseStruct * WinEDA_SchematicFrame::CreateNewText(wxDC * DC, int type)
  130. /*************************************************************************/
  131. /* Routine to create new text struct (GraphicText, label or Glabel).
  132. */
  133. {
  134. DrawTextStruct * NewText = NULL;
  135. g_ItemToRepeat = NULL;
  136. switch( type )
  137. {
  138. case LAYER_NOTES:
  139. NewText = new DrawTextStruct(m_CurrentScreen->m_Curseur);
  140. NewText->m_Size.x = NewText->m_Size.y = g_DefaultTextLabelSize;
  141. break;
  142. case LAYER_LOCLABEL:
  143. {
  144. NewText = new DrawLabelStruct(m_CurrentScreen->m_Curseur);
  145. NewText->m_Size.x = NewText->m_Size.y = g_DefaultTextLabelSize;
  146. }
  147. break;
  148. case LAYER_GLOBLABEL:
  149. NewText = new DrawGlobalLabelStruct(m_CurrentScreen->m_Curseur);
  150. NewText->m_Size.x = NewText->m_Size.y = g_DefaultTextLabelSize;
  151. ((DrawGlobalLabelStruct*)NewText)->m_Shape = s_DefaultShapeGLabel;
  152. ((DrawGlobalLabelStruct*)NewText)->m_Orient = s_DefaultOrientGLabel;
  153. break;
  154. default:
  155. DisplayError(this, wxT("Editexte: Internal error") );
  156. break;
  157. }
  158. NewText->m_Flags = IS_NEW | IS_MOVED;
  159. RedrawOneStruct(DrawPanel, DC, NewText, g_XorMode);
  160. EditSchematicText(NewText, DC);
  161. if ( NewText->m_Text.IsEmpty() )
  162. {
  163. delete NewText;
  164. return NULL;
  165. }
  166. if ( type == LAYER_GLOBLABEL )
  167. {
  168. s_DefaultShapeGLabel = ((DrawGlobalLabelStruct*)NewText)->m_Shape;
  169. s_DefaultOrientGLabel = ((DrawGlobalLabelStruct*)NewText)->m_Orient;
  170. }
  171. RedrawOneStruct(DrawPanel, DC, NewText, GR_DEFAULT_DRAWMODE);
  172. DrawPanel->ManageCurseur = ShowWhileMoving;
  173. DrawPanel->ForceCloseManageCurseur = ExitMoveTexte;
  174. m_CurrentScreen->m_CurrentItem = NewText;
  175. return NewText;
  176. }
  177. /****************************************/
  178. /* Dessin du Texte en deplacement */
  179. /****************************************/
  180. static void ShowWhileMoving(WinEDA_DrawPanel * panel, wxDC * DC, bool erase)
  181. {
  182. EDA_BaseStruct * TextStruct = panel->GetScreen()->m_CurrentItem;
  183. /* effacement ancienne position */
  184. if( erase )
  185. RedrawOneStruct(panel, DC, TextStruct, g_XorMode);
  186. /* Redessin du texte */
  187. switch( TextStruct->m_StructType )
  188. {
  189. case DRAW_LABEL_STRUCT_TYPE:
  190. case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
  191. case DRAW_TEXT_STRUCT_TYPE:
  192. ((DrawTextStruct*)TextStruct)->m_Pos = panel->GetScreen()->m_Curseur;
  193. break;
  194. default: break;
  195. }
  196. RedrawOneStruct(panel, DC, TextStruct, g_XorMode);
  197. }
  198. /*************************************************************/
  199. static void ExitMoveTexte(WinEDA_DrawPanel * Panel, wxDC *DC)
  200. /*************************************************************/
  201. /* Routine de sortie des menus de Texte */
  202. {
  203. SCH_SCREEN * screen = (SCH_SCREEN *) Panel->m_Parent->m_CurrentScreen;
  204. EDA_BaseStruct * Struct = screen->m_CurrentItem;
  205. g_ItemToRepeat = NULL;
  206. Panel->ManageCurseur = NULL;
  207. Panel->ForceCloseManageCurseur = NULL;
  208. if( Struct == NULL) /* Pas de trace en cours */
  209. {
  210. return;
  211. }
  212. /* ici : trace en cours */
  213. /* Effacement du trace en cours et suppression eventuelle de la structure */
  214. RedrawOneStruct(Panel, DC, Struct, g_XorMode);
  215. if( Struct->m_Flags & IS_NEW ) /* Suppression du nouveau texte en cours de placement */
  216. {
  217. delete Struct;
  218. screen->m_CurrentItem = NULL;
  219. }
  220. else /* Remise a jour des anciens parametres du texte */
  221. {
  222. switch( Struct->m_StructType )
  223. {
  224. case DRAW_LABEL_STRUCT_TYPE:
  225. case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
  226. case DRAW_TEXT_STRUCT_TYPE:
  227. {
  228. DrawTextStruct * Text = (DrawTextStruct *) Struct;
  229. Text->m_Pos = ItemInitialPosition;
  230. Text->m_Size = OldSize;
  231. Text->m_Orient = OldOrient;
  232. }
  233. break;
  234. default: break;
  235. }
  236. RedrawOneStruct(Panel, DC, Struct, GR_DEFAULT_DRAWMODE);
  237. Struct->m_Flags = 0;
  238. }
  239. }
  240. /*****************************************************************************/
  241. void WinEDA_SchematicFrame::ConvertTextType(DrawTextStruct * Text,
  242. wxDC * DC, int newtype)
  243. /*****************************************************************************/
  244. /* Routine to change a text type to an other one (GraphicText, label or Glabel).
  245. */
  246. {
  247. if ( Text == NULL ) return;
  248. /* save Text in undo list if not already in edit, or moving ... */
  249. if ( Text->m_Flags == 0 )
  250. SaveCopyInUndoList(Text, IS_CHANGED);
  251. DrawPanel->CursorOff(DC); // Erase schematic cursor
  252. RedrawOneStruct(DrawPanel, DC, Text, g_XorMode); // erase drawing
  253. switch( newtype )
  254. {
  255. case DRAW_LABEL_STRUCT_TYPE:
  256. Text->m_StructType = DRAW_LABEL_STRUCT_TYPE;
  257. Text->m_Layer = LAYER_LOCLABEL;
  258. break;
  259. case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
  260. Text->m_StructType = DRAW_GLOBAL_LABEL_STRUCT_TYPE;
  261. Text->m_Layer = LAYER_GLOBLABEL;
  262. break;
  263. case DRAW_TEXT_STRUCT_TYPE:
  264. Text->m_StructType = DRAW_TEXT_STRUCT_TYPE;
  265. Text->m_Layer = LAYER_NOTES;
  266. break;
  267. default:
  268. DisplayError(this, wxT("ConvertTextType: Internal error") );
  269. break;
  270. }
  271. RedrawOneStruct(DrawPanel, DC, Text, GR_DEFAULT_DRAWMODE);
  272. DrawPanel->CursorOn(DC); // redraw schematic cursor
  273. }