summaryrefslogtreecommitdiff
path: root/app/bin/ctext.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/ctext.c')
-rw-r--r--app/bin/ctext.c259
1 files changed, 259 insertions, 0 deletions
diff --git a/app/bin/ctext.c b/app/bin/ctext.c
new file mode 100644
index 0000000..0779ef5
--- /dev/null
+++ b/app/bin/ctext.c
@@ -0,0 +1,259 @@
+/*
+ * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/bin/ctext.c,v 1.4 2008-03-06 19:35:06 m_fischer Exp $
+ *
+ * TEXT
+ *
+ */
+
+/* XTrkCad - Model Railroad CAD
+ * Copyright (C) 2005 Dave Bullis
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "track.h"
+#include "i18n.h"
+
+
+track_p NewText( wIndex_t index, coOrd p, ANGLE_T angle, char * text, CSIZE_T textSize, wDrawColor color );
+
+void LoadFontSizeList( wList_p, long );
+void UpdateFontSizeList( long *, wList_p, wIndex_t );
+
+static wMenu_p textPopupM;
+
+/*****************************************************************************
+ * TEXT COMMAND
+ */
+
+static struct {
+ STATE_T state;
+ CSIZE_T len;
+ coOrd cursPos0, cursPos1;
+ POS_T cursHeight;
+ POS_T textLen;
+ coOrd pos;
+ ANGLE_T angle;
+ long size;
+ wIndex_t fontSizeInx;
+ char text[STR_SIZE];
+ wDrawColor color;
+ } Dt;
+
+static paramData_t textPLs[] = {
+#define textPD (textPLs[0])
+ { PD_DROPLIST, &Dt.fontSizeInx, "fontsize", 0, NULL, N_("Font Size"), BL_EDITABLE },
+#define colorPD (textPLs[1])
+ { PD_COLORLIST, &Dt.color, "color", PDO_NORECORD, NULL, N_("Color") }
+ };
+static paramGroup_t textPG = { "text", 0, textPLs, sizeof textPLs/sizeof textPLs[0] };
+
+
+static void TextDlgUpdate(
+ paramGroup_p pg,
+ int inx,
+ void * context )
+{
+ coOrd size;
+
+ switch (inx) {
+ case 0:
+ if ( Dt.state == 1 ) {
+ DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ }
+ UpdateFontSizeList( &Dt.size, (wList_p)textPLs[0].control, Dt.fontSizeInx );
+ /*wWinSetBusy( mainW, TRUE );*/
+ if ( Dt.state == 1 ) {
+ DrawTextSize( &mainD, Dt.text, NULL, Dt.size, TRUE, &size );
+ Dt.textLen = size.x;
+ }
+ DrawTextSize( &mainD, "X", NULL, Dt.size, TRUE, &size );
+ Dt.cursHeight = size.y;
+ /*wWinSetBusy( mainW, FALSE );*/
+ if ( Dt.state == 1 ) {
+ Dt.cursPos0.x = Dt.cursPos1.x = Dt.pos.x+Dt.textLen;
+ Dt.cursPos1.y = Dt.pos.y+Dt.cursHeight;
+ DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ }
+ MainRedraw();
+ break;
+ }
+}
+
+
+static STATUS_T CmdText( wAction_t action, coOrd pos )
+{
+ track_p t;
+ unsigned char c;
+ wControl_p controls[3];
+ char * labels[2];
+ coOrd size;
+
+ switch (action & 0xFF) {
+ case C_START:
+ /* check if font size was updated by the preferences dialog */
+ Dt.size = (CSIZE_T)wSelectedFontSize();
+ Dt.state = 0;
+ Dt.cursPos0 = Dt.cursPos1 = zero;
+ Dt.len = 0;
+ Dt.textLen = 0;
+ Dt.text[0] = '\0';
+ if ( !inPlayback )
+ wWinSetBusy( mainW, TRUE );
+ DrawTextSize( &mainD, "X", NULL, Dt.size, TRUE, &size );
+ Dt.cursHeight = size.y;
+ if ( !inPlayback )
+ wWinSetBusy( mainW, FALSE );
+ if ( textPD.control==NULL ) {
+ ParamCreateControls( &textPG, TextDlgUpdate );
+ }
+ LoadFontSizeList( (wList_p)textPD.control, Dt.size );
+ ParamGroupRecord( &textPG );
+ controls[0] = textPD.control;
+ controls[1] = colorPD.control;
+ controls[2] = 0;
+ labels[0] = N_("Font Size");
+ labels[1] = N_("Color");
+ InfoSubstituteControls( controls, labels );
+ return C_CONTINUE;
+ break;
+ case C_DOWN:
+ if (Dt.state != 0) {
+ //DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ //DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ }
+ Dt.pos = pos;
+ Dt.cursPos0.y = Dt.cursPos1.y = pos.y;
+ Dt.cursPos0.x = Dt.cursPos1.x = pos.x + Dt.textLen;
+ Dt.cursPos1.y += Dt.cursHeight;
+ DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ Dt.state = 1;
+ MainRedraw();
+ return C_CONTINUE;
+ case C_MOVE:
+ //DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ //DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ Dt.pos = pos;
+ Dt.cursPos0.y = Dt.cursPos1.y = pos.y;
+ Dt.cursPos0.x = Dt.cursPos1.x = pos.x + Dt.textLen;
+ Dt.cursPos1.y += Dt.cursHeight;
+ DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, wDrawColorBlack );
+ DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ MainRedraw();
+ return C_CONTINUE;
+ case C_UP:
+ return C_CONTINUE;
+ case C_TEXT:
+ if (Dt.state == 0) {
+ NoticeMessage( MSG_SEL_POS_FIRST, _("Ok"), NULL );
+ return C_CONTINUE;
+ }
+ DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ c = (unsigned char)(action >> 8);
+/*lprintf("C=%x\n", c);*/
+ switch (c) {
+ case '\b':
+ case 0xFF:
+ if (Dt.len > 0) {
+ Dt.len--;
+ Dt.text[Dt.len] = '\000';
+ } else {
+ wBeep();
+ }
+ break;
+ case '\015':
+ UndoStart( _("Create Text"), "newText - CR" );
+ t = NewText( 0, Dt.pos, Dt.angle, Dt.text, (CSIZE_T)Dt.size, Dt.color );
+ UndoEnd();
+ DrawNewTrack(t);
+ Dt.state = 0;
+ InfoSubstituteControls( NULL, NULL );
+ return C_TERMINATE;
+ default:
+ if (Dt.len < sizeof Dt.text - 1 ) {
+ Dt.text[Dt.len++] = (char)c;
+ Dt.text[Dt.len] = '\000';
+ }
+ }
+ DrawTextSize( &mainD, Dt.text, NULL, Dt.size, TRUE, &size );
+ Dt.textLen = size.x;
+ Dt.cursPos0.x = Dt.cursPos1.x = Dt.pos.x + Dt.textLen;
+ DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ return C_CONTINUE;
+ case C_REDRAW:
+ if (Dt.state == 1) {
+ DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ }
+ return C_CONTINUE;
+ case C_CANCEL:
+ if (Dt.state != 0) {
+ //DrawString( &tempD, Dt.pos, 0.0, Dt.text, NULL, (FONTSIZE_T)Dt.size, Dt.color );
+ //DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ Dt.state = 0;
+ }
+ InfoSubstituteControls( NULL, NULL );
+ MainRedraw();
+ return C_TERMINATE;
+ case C_OK:
+ if (Dt.state != 0) {
+ DrawLine( &tempD, Dt.cursPos0, Dt.cursPos1, 0, Dt.color );
+ Dt.state = 0;
+ if (Dt.len) {
+ UndoStart( _("Create Text"), "newText - OK" );
+ t = NewText( 0, Dt.pos, Dt.angle, Dt.text, (CSIZE_T)Dt.size, Dt.color );
+ UndoEnd();
+ DrawNewTrack(t);
+ }
+ }
+ InfoSubstituteControls( NULL, NULL );
+ MainRedraw();
+ return C_TERMINATE;
+
+ case C_FINISH:
+ if (Dt.state != 0 && Dt.len > 0)
+ CmdText( C_OK, pos );
+ else
+ CmdText( C_CANCEL, pos );
+ return C_TERMINATE;
+
+ case C_CMDMENU:
+ wMenuPopupShow( textPopupM );
+ return C_CONTINUE;
+ }
+ return C_CONTINUE;
+}
+
+
+#include "bitmaps/text.xpm"
+
+void InitCmdText( wMenu_p menu )
+{
+ AddMenuButton( menu, CmdText, "cmdText", _("Text"), wIconCreatePixMap(text_xpm), LEVEL0_50, IC_STICKY|IC_CMDMENU|IC_POPUP2, ACCL_TEXT, NULL );
+ textPopupM = MenuRegister( "Text Font" );
+ wMenuPushCreate( textPopupM, "", _("Fonts..."), 0, (wMenuCallBack_p)SelectFont, NULL );
+ Dt.size = (CSIZE_T)wSelectedFontSize();
+ Dt.color = wDrawColorBlack;
+ ParamRegister( &textPG );
+}
+
+void InitTrkText( void )
+{
+}