Seite 1 von 2

Text Editor (nur Windows)

Verfasst: 23.02.2011 22:27
von Mr.L
Diesen kleinen Texteditor habe ich für ein Projekt geschrieben, an dem ich gerade arbeite.
Evtl. hat ja außer mir noch jemand Verwendung dafür.
Leider ist er aufgrund massiven API-Einsatzes nur unter Windows lauffähig.

*UPDATE*
Danke für die Feedbacks.
Ich habe eine Öffnen- und Speichern-Funktion eingebaut.
Es fehlen noch Funktionen wie "Seite einrichten", "Drucken", Tabstops etc,
die Buttons könnten durch eine Toolbar mit schicken Icons ersetzt werden...
aber das würde, glaube ich, den Rahmen für Tipps und Tricks sprengen.

*UPDATE* 25.10.2011
gesamten Code überarbeitet
hinzugefügt: Speichern als UTF-8
hinzugefügt: Hintergrundfarbe wählbar

Code: Alles auswählen

EnableExplicit

Enumeration
	#Editor_Window
	#Editor_Gadget
	#Editor_StyleF
	#Editor_StyleY
	#Editor_StyleB
	#Editor_StyleI
	#Editor_StyleU
	#Editor_StyleFC
	#Editor_StyleBC
	#Editor_Number
	#Editor_AlignR
	#Editor_AlignC
	#Editor_AlignL
	
	#Editor_Menu
	#Editor_MenuNew
	#Editor_MenuOpen
	#Editor_MenuSave
	#Editor_MenuQuit
	
	#Editor_ImageFC
	#Editor_ImageBC
EndEnumeration

#CFM_BACKCOLOR 	= $4000000
#SF_USECODEPAGE	= $20
#CP_UTF8		= 65001

Global Editor_FileName$ = ""
Global Editor_Pattern$ = "RTF (*.rtf)|*.rtf|Text (*.txt)|*.txt|Unicode (*.txt)|*.txt|UTF8 (*.utf8)|*.utf8"

Procedure Editor_EnumFontProc(*lpelfe.LOGFONT , *lpntme.TEXTMETRIC , fontType , lParam)
	AddGadgetItem(#Editor_StyleF , -1 , PeekS(@*lpelfe\lfFaceName))
	ProcedureReturn 1
EndProcedure

Procedure Editor_StreamOutCallback(dwCookie , *pbBuff , cb , *pcb.Long)
	*pcb\l = WriteData(dwCookie , *pbBuff , cb)
	ProcedureReturn (Not *pcb\l)
EndProcedure

Procedure Editor_StreamInCallback(dwCookie , *pbBuff.l , cb , *pcb.Long)
	*pcb\l = ReadData(dwCookie , *pbBuff , cb)
	ProcedureReturn (Not *pcb\l)
EndProcedure

Procedure Editor_UpdateGadgets(editor)
	Protected cf.CHARFORMAT2
	Protected pf.PARAFORMAT2
	Protected fName$ , i
	
	cf\cbSize   = SizeOf(CHARFORMAT2)
	SendMessage_(GadgetID(editor) , #EM_GETCHARFORMAT , #SCF_SELECTION , cf)
	
	pf\cbSize   = SizeOf(PARAFORMAT2)
	SendMessage_(GadgetID(editor) , #EM_GETPARAFORMAT , 0 , pf)   
	
	If cf\dwMask   & #CFM_SIZE
		SetGadgetText(#Editor_StyleY , Str(cf\yHeight * 0.05))
	EndIf   
	If cf\dwMask   & #CFM_FACE
		fName$ = PeekS(@cf\szFaceName , 32)
		For i = 0 To CountGadgetItems(#Editor_StyleF) - 1
			If GetGadgetItemText(#Editor_StyleF , i) = fName$
				SetGadgetState(#Editor_StyleF , i)
				Break
			EndIf
		Next
	EndIf   
	If cf\dwEffects & #CFE_BOLD
		SetGadgetState(#Editor_StyleB , 1)
	Else
		SetGadgetState(#Editor_StyleB , 0)
	EndIf
	If cf\dwEffects & #CFE_ITALIC
		SetGadgetState(#Editor_StyleI , 1)
	Else
		SetGadgetState(#Editor_StyleI , 0)
	EndIf
	If cf\dwEffects & #CFE_UNDERLINE
		SetGadgetState(#Editor_StyleU , 1)
	Else
		SetGadgetState(#Editor_StyleU , 0)
	EndIf   
	If cf\crTextColor <> -1
		StartDrawing(ImageOutput(#Editor_ImageFC))
		Box(0,0,ImageWidth(#Editor_ImageFC),ImageHeight(#Editor_ImageFC), cf\crTextColor)
		StopDrawing()
		SetGadgetAttribute(#Editor_StyleFC , #PB_Button_Image , ImageID(#Editor_ImageFC))
	EndIf
	If cf\crBackColor <> -1
		StartDrawing(ImageOutput(#Editor_ImageBC))
		Box(0,0,ImageWidth(#Editor_ImageBC),ImageHeight(#Editor_ImageBC), cf\crBackColor)
		StopDrawing()
		SetGadgetAttribute(#Editor_StyleBC , #PB_Button_Image , ImageID(#Editor_ImageBC))
	EndIf
	If pf\dwMask & #PFM_ALIGNMENT
		SetGadgetState(#Editor_AlignR , 0)
		SetGadgetState(#Editor_AlignC , 0)
		SetGadgetState(#Editor_AlignL , 0)   
		Select pf\wAlignment
			Case #PFA_LEFT		: SetGadgetState(#Editor_AlignL , 1)
			Case #PFA_CENTER	: SetGadgetState(#Editor_AlignC , 1)
			Case #PFA_RIGHT		: SetGadgetState(#Editor_AlignR , 1)
		EndSelect
	EndIf
	If pf\dwMask & #PFM_NUMBERING
		Select pf\wNumbering
			Case 0				: SetGadgetState(#Editor_Number , 0)            
			Default			: SetGadgetState(#Editor_Number , 1)
				
		EndSelect
	EndIf   
	SetActiveGadget(editor)
EndProcedure

Procedure Editor_SetFontName(editor , fontName$)
	Protected cf.CHARFORMAT2
	If fontName$ <> ""
		cf\cbSize		= SizeOf(CHARFORMAT2)               
		cf\dwMask		= #CFM_FACE
		PokeS(@cf\szFaceName   , fontName$ , 32)
		SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)
		Editor_UpdateGadgets(editor)
	EndIf
EndProcedure

Procedure Editor_SetFontHeight(editor , fontSize)   
	Protected cf.CHARFORMAT2
	If fontSize > 0
		cf\cbSize		= SizeOf(CHARFORMAT2)               
		cf\dwMask		= #CFM_SIZE
		cf\yHeight		= fontSize * 20.0
		SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)
		Editor_UpdateGadgets(editor)
	EndIf   
EndProcedure

Procedure Editor_SetFontColor(editor , fontColor)
	Protected cf.CHARFORMAT2
	If fontColor <> -1      
		cf\cbSize		= SizeOf(CHARFORMAT2)               
		cf\dwMask		= #CFM_COLOR
		cf\crTextColor	= fontColor
		SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)      
		Editor_UpdateGadgets(editor)
	EndIf
EndProcedure

Procedure Editor_SetBackColor(editor , backColor)
	Protected cf.CHARFORMAT2
	If backColor <> -1      
		cf\cbSize		= SizeOf(CHARFORMAT2)               
		cf\dwMask		= #CFM_BACKCOLOR
		cf\crBackColor	= backColor
		SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)      
		Editor_UpdateGadgets(editor)
	EndIf
EndProcedure

Procedure Editor_SetFontStyle(editor , mask)
	Protected cf.CHARFORMAT2
	cf\cbSize			= SizeOf(CHARFORMAT2)               
	cf\dwMask			= mask
	cf\dwEffects		= 0
	If GetGadgetState(#Editor_StyleB)
		cf\dwEffects	| #CFE_BOLD
	EndIf
	If GetGadgetState(#Editor_StyleI)
		cf\dwEffects	| #CFE_ITALIC
	EndIf
	If GetGadgetState(#Editor_StyleU)
		cf\dwEffects	| #CFE_UNDERLINE
	EndIf
	SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)               
	Editor_UpdateGadgets(editor)
EndProcedure

Procedure Editor_SetAlignment(editor , alignment)
	Protected pf.PARAFORMAT2
	pf\cbSize			= SizeOf(PARAFORMAT2)               
	pf\dwMask			= #PFM_ALIGNMENT
	pf\wAlignment		= alignment
	SendMessage_(GadgetID(editor) , #EM_SETPARAFORMAT , 0 , pf)
	Editor_UpdateGadgets(editor)
EndProcedure

Procedure Editor_SetNumbering(editor , format)
	Protected pf.PARAFORMAT2
	pf\cbSize			= SizeOf(PARAFORMAT2)               
	pf\dwMask			= #PFM_NUMBERING | #PFM_NUMBERINGTAB
	pf\wNumbering		= format
	pf\wNumberingTab	= 500
	SendMessage_(GadgetID(editor) , #EM_SETPARAFORMAT , 0 , pf)
	Editor_UpdateGadgets(editor)
EndProcedure

Procedure Editor_Quit()
	End	
EndProcedure

Procedure Editor_Callback(hwnd , msg , wparam , lparam)
	Protected *nmhdr.NMHDR	
	If msg = #WM_NOTIFY
		*nmhdr = lparam
		If *nmhdr\code = #EN_SELCHANGE
			Editor_UpdateGadgets(*nmhdr\idFrom)
		EndIf		
	EndIf	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure Editor_Initialize(editor , fontName$ = "Arial" , fontHeight = 10 , fontStyle = 0 , fontColor = #Black , backColor = #White)
	Protected lf.LOGFONT , y
	
	ClearGadgetItems(editor)
	ClearGadgetItems(#Editor_StyleF)
	ClearGadgetItems(#Editor_StyleY)
	
	EnumFontFamiliesEx_(GetDC_(GadgetID(editor)) , lf , @Editor_EnumFontProc() , 0 , 0)
	
	For y = 1 To 100
		AddGadgetItem(#Editor_StyleY , -1 , Str(y))
	Next	
	
	If fontStyle & #CFM_BOLD
		SetGadgetState(#Editor_StyleB , 1)
	Else
		SetGadgetState(#Editor_StyleB , 0)
	EndIf   
	If fontStyle & #CFM_ITALIC
		SetGadgetState(#Editor_StyleI , 1)
	Else
		SetGadgetState(#Editor_StyleI , 0)
	EndIf   
	If fontStyle & #CFM_UNDERLINE
		SetGadgetState(#Editor_StyleU , 1)
	Else
		SetGadgetState(#Editor_StyleU , 0)
	EndIf   
	Editor_SetFontStyle	(editor , fontStyle)   
	Editor_SetFontName	(editor , fontName$)
	Editor_SetFontHeight(editor , fontHeight)
	Editor_SetFontColor	(editor , fontColor)
	Editor_SetBackColor	(editor , backColor)
	
	SendMessage_(GadgetID(editor) , #EM_SETEVENTMASK , 0 , #ENM_SELCHANGE)
	SetWindowCallback(@Editor_Callback())
EndProcedure

Procedure Editor_Open(editor , fileName$)
	Protected es.EDITSTREAM , file
	file = ReadFile(#PB_Any , fileName$)
	If IsFile(file)
		Editor_Initialize(editor)
		es\pfnCallback	= @Editor_StreamInCallback()
		es\dwCookie		= file
		Select SelectedFilePattern()
			Case 0 : SendMessage_(GadgetID(editor) , #EM_STREAMIN , #SF_RTF , es)
			Case 1 : SendMessage_(GadgetID(editor) , #EM_STREAMIN , #SF_TEXT , es)
			Case 2 : SendMessage_(GadgetID(editor) , #EM_STREAMIN , #SF_UNICODE | #SF_TEXT , es)
			Case 3 : SendMessage_(GadgetID(editor) , #EM_STREAMIN , (#CP_UTF8 << 16) | #SF_USECODEPAGE | #SF_TEXT , es)				
		EndSelect		
		CloseFile(file)
		Editor_FileName$ = fileName$
	EndIf
EndProcedure

Procedure Editor_Save(editor , fileName$)
	Protected es.EDITSTREAM , file
	file = CreateFile(#PB_Any , fileName$)
	If IsFile(file)		
		es\pfnCallback	= @Editor_StreamOutCallback()
		es\dwCookie		= file		
		Select SelectedFilePattern()
			Case 0 : SendMessage_(GadgetID(editor) , #EM_STREAMOUT , #SF_RTF , es)
			Case 1 : SendMessage_(GadgetID(editor) , #EM_STREAMOUT , #SF_TEXT , es)
			Case 2 : SendMessage_(GadgetID(editor) , #EM_STREAMOUT , #SF_UNICODE | #SF_TEXT , es)
			Case 3 : SendMessage_(GadgetID(editor) , #EM_STREAMOUT , (#CP_UTF8 << 16) | #SF_USECODEPAGE | #SF_TEXT , es)				
		EndSelect		
		CloseFile(file)
		Editor_FileName$ = fileName$
	EndIf
EndProcedure

CreateImage(#Editor_ImageFC,12,12)
CreateImage(#Editor_ImageBC,12,12)

OpenWindow(#Editor_Window,0,0,500,500,"TextEditor" , #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)

CreateMenu(#Editor_Menu , WindowID(#Editor_Window))
MenuTitle("Datei")
MenuItem(#Editor_MenuNew 	, "Neu")
MenuItem(#Editor_MenuOpen	, "Öffnen")
MenuItem(#Editor_MenuSave	, "Speichern")
MenuBar()
MenuItem(#Editor_MenuQuit 	, "Beenden")

ComboBoxGadget		(#Editor_StyleF   ,  5,  5,140, 20)
ComboBoxGadget		(#Editor_StyleY   ,155,  5, 50, 20)
ButtonGadget		(#Editor_StyleB   ,215,  5, 20, 20 , "B"	,#PB_Button_Toggle)
ButtonGadget		(#Editor_StyleI   ,240,  5, 20, 20 , "I"	,#PB_Button_Toggle)
ButtonGadget		(#Editor_StyleU   ,265,  5, 20, 20 , "U"	,#PB_Button_Toggle)
ButtonGadget		(#Editor_AlignL   ,305,  5, 20, 20 , "<"	,#PB_Button_Toggle)
ButtonGadget		(#Editor_AlignC   ,330,  5, 20, 20 , "-"	,#PB_Button_Toggle)
ButtonGadget		(#Editor_AlignR   ,355,  5, 20, 20 , ">"	,#PB_Button_Toggle)
ButtonGadget		(#Editor_Number   ,395,  5, 20, 20 , "o"	,#PB_Button_Toggle)
ButtonImageGadget	(#Editor_StyleFC  ,435,  5, 20, 20 , ImageID(#Editor_ImageFC))
ButtonImageGadget	(#Editor_StyleBC  ,455,  5, 20, 20 , ImageID(#Editor_ImageBC))
EditorGadget		(#Editor_Gadget, 5, 30,490,445)

Editor_Initialize(#Editor_Gadget)

Repeat   
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow			
			Editor_Quit()
		Case #PB_Event_SizeWindow
			ResizeGadget(#Editor_Gadget , #PB_Ignore,#PB_Ignore , WindowWidth(#Editor_Window) - 10 , WindowHeight(#Editor_Window) - 55)
		Case #PB_Event_Gadget         
			Select EventGadget()
				Case #Editor_StyleF
					Editor_SetFontName(#Editor_Gadget , GetGadgetText(#Editor_StyleF))
				Case #Editor_StyleY               
					Editor_SetFontHeight(#Editor_Gadget , Val(GetGadgetText(#Editor_StyleY)))
				Case #Editor_StyleB
					Editor_SetFontStyle(#Editor_Gadget , #CFM_BOLD)
				Case #Editor_StyleI
					Editor_SetFontStyle(#Editor_Gadget , #CFM_ITALIC)
				Case #Editor_StyleU
					Editor_SetFontStyle(#Editor_Gadget , #CFM_UNDERLINE)
				Case #Editor_StyleFC
					Editor_SetFontColor(#Editor_Gadget , ColorRequester())
				Case #Editor_StyleBC
					Editor_SetBackColor(#Editor_Gadget , ColorRequester())  
				Case #Editor_Number
					Editor_SetNumbering(#Editor_Gadget , GetGadgetState(#Editor_Number))
				Case #Editor_AlignL
					Editor_SetAlignment(#Editor_Gadget , #PFA_LEFT)
				Case #Editor_AlignC
					Editor_SetAlignment(#Editor_Gadget , #PFA_CENTER)
				Case #Editor_AlignR
					Editor_SetAlignment(#Editor_Gadget , #PFA_RIGHT)
			EndSelect
		Case #PB_Event_Menu
			Select EventMenu()
				Case #Editor_MenuNew
					ClearGadgetItems(#Editor_Gadget)
				Case #Editor_MenuOpen
					Editor_Open(#Editor_Gadget , OpenFileRequester("" , Editor_FileName$ , Editor_Pattern$ , SelectedFilePattern()))
				Case #Editor_MenuSave
					Editor_Save(#Editor_Gadget , SaveFileRequester("" , Editor_FileName$ , Editor_Pattern$ , SelectedFilePattern()))
				Case #Editor_MenuQuit
					Editor_Quit()
			EndSelect         
	EndSelect   	
ForEver

Re: Text Editor (nur Windows)

Verfasst: 23.02.2011 22:58
von STARGÅTE
Danke für den Code, aber fehlt da nicht sowas wie Editor_Load() und Editor_Save() ?
Ich meine, welchen nutzen hat denn dieser Code, wenn es keine möglichkeit gibt die Formatierung in PB weiter zu nutzen ?
Denn ich vermute GetGadgetText() bringt mir hier nichts oder ?

Re: Text Editor (nur Windows)

Verfasst: 23.02.2011 23:17
von ts-soft
STARGÅTE hat geschrieben:Denn ich vermute GetGadgetText() bringt mir hier nichts oder ?
Als RTF-Stream speichern, Codebeispiele im Codearchiv.

Hätte er aber einbauen sollen, gehört irgendwie dazu :mrgreen:

Re: Text Editor (nur Windows)

Verfasst: 23.02.2011 23:50
von rolaf
Notfalls nimmste wie unser VonUndZu Copy & Paste und fügst es in WordPad ein. :wink:

Re: Text Editor (nur Windows)

Verfasst: 20.10.2011 18:16
von Angelo
Ich finde den Editor ganz toll. Neben dem Abspeichern im rtf-Format und txt-Ansi-Format möchte ich auch im UTF8-Format abspeichern. Leider vermisse ich eine Api-Konstante a la #SF_UTF8 analog zu #SF_RTF bzw. #SF_TEXT. Gibt es trotzdem eine Möglichkeit, in diesem Format abzuspeichern?

Re: Text Editor (nur Windows)

Verfasst: 20.10.2011 19:40
von Bisonte
Sieht gut aus.
Aber wie bekomm ich den Editor dazu überredet, den ausgewählten Font auch zu benutzen ?

(Text markiert, Zeichensatz ausgewählt. Nix Passiert. oder Zeichensatz auswählen, sobald man schreiben will isser wieder Arial.)

Re: Text Editor (nur Windows)

Verfasst: 24.10.2011 00:03
von Mr.L
Bisonte hat geschrieben: Aber wie bekomm ich den Editor dazu überredet, den ausgewählten Font auch zu benutzen ?
Die Zeile 272

Code: Alles auswählen

If EventType() = #PB_EventType_TitleChange
muss geändert werden in

Code: Alles auswählen

If EventType() = #PB_EventType_Change
Ich glaube in der 4.5er Version hat das noch funktioniert.

Re: Text Editor (nur Windows)

Verfasst: 24.10.2011 06:42
von rolaf
Mr.L hat geschrieben:Die Zeile 272

Code: Alles auswählen

If EventType() = #PB_EventType_TitleChange
muss geändert werden in

Code: Alles auswählen

If EventType() = #PB_EventType_Change
Ich glaube in der 4.5er Version hat das noch funktioniert.
Ja, in 4.51 funktioniert nur der obere Code, beim unteren tut sich nix.

Re: Text Editor (nur Windows)

Verfasst: 25.10.2011 21:03
von Mr.L
Angelo hat geschrieben:Neben dem Abspeichern im rtf-Format und txt-Ansi-Format möchte ich auch im UTF8-Format abspeichern.
Ich habe den Code überarbeitet.
Speichern kann man jetzt als RTF, Text, Unicode und UTF-8.

Re: Text Editor (nur Windows)

Verfasst: 25.10.2011 21:33
von Falko
:allright: Danke @Mr.L