11package com .devkev .gui ;
22
33import java .awt .Color ;
4+ import java .awt .Desktop ;
45import java .awt .Dimension ;
56import java .awt .Font ;
7+ import java .awt .HeadlessException ;
68import java .awt .KeyEventDispatcher ;
79import java .awt .KeyboardFocusManager ;
810import java .awt .Toolkit ;
11+ import java .awt .datatransfer .DataFlavor ;
12+ import java .awt .datatransfer .StringSelection ;
13+ import java .awt .datatransfer .UnsupportedFlavorException ;
914import java .awt .event .ActionEvent ;
1015import java .awt .event .ActionListener ;
1116import java .awt .event .ComponentEvent ;
2025import java .io .FileReader ;
2126import java .io .FileWriter ;
2227import java .io .IOException ;
28+ import java .net .URI ;
29+ import java .net .URISyntaxException ;
30+ import java .util .ArrayList ;
2331
2432import javax .swing .BorderFactory ;
2533import javax .swing .JButton ;
@@ -61,14 +69,18 @@ public class Window {
6169
6270 private static Font font ;
6371 private File openedFile = null ; //Null means, creating a new file when saving.
72+ private static final String TITLE = "Devscript 1.9.0 Editor (pre alpha build)" ;
73+ private ArrayList <String > history = new ArrayList <String >();
74+ private int historyIndex = 0 ;
75+ public int maxHistorySize = 50 ;
6476
6577 public Window () {
6678 try {
6779 UIManager .setLookAndFeel ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );
6880 } catch (Exception evt ) {}
6981 font = new Font ("Consolas" , Font .PLAIN , 13 );
7082
71- window = new JFrame ("Devscript 1.9.0 Editor (pre alpha build) " );
83+ window = new JFrame (TITLE + " - unsaved " );
7284 window .setVisible (true );
7385 window .setResizable (true );
7486 window .setLayout (null );
@@ -142,6 +154,7 @@ public boolean dispatchKeyEvent(KeyEvent e) {
142154 public void actionPerformed (ActionEvent e ) {
143155 textArea .setText ("" );
144156 openedFile = null ;
157+ window .setTitle (TITLE + " - unsaved" );
145158 }
146159 });
147160 m .add (newFile );
@@ -164,7 +177,9 @@ public void actionPerformed(ActionEvent e) {
164177 }
165178 reader .close ();
166179 window .setEnabled (true );
180+ window .toFront ();
167181 openedFile = chooser .getSelectedFile ();
182+ window .setTitle (TITLE );
168183 } catch (Exception e1 ) {
169184 e1 .printStackTrace ();
170185 window .setEnabled (true );
@@ -183,26 +198,60 @@ public void actionPerformed(ActionEvent e) {
183198 if (textArea .getText ().isEmpty ()) return ;
184199 window .setEnabled (false );
185200 JFileChooser chooser = new JFileChooser ();
186- chooser .setDialogTitle ("Save new file " );
201+ chooser .setDialogTitle ("Save New File " );
187202 int res = chooser .showSaveDialog (new JFrame ());
188- if (res == JFileChooser .APPROVE_OPTION ) {
189- BufferedWriter writer = new BufferedWriter (new FileWriter (chooser .getSelectedFile ()));
190- try {
191- writer .write (textArea .getText ());
192- writer .close ();
193- } catch (IOException e1 ) {
194- e1 .printStackTrace ();
195- }
196- }
203+ if (res == JFileChooser .APPROVE_OPTION ) saveDocument (chooser .getSelectedFile ());
197204 window .setEnabled (true );
198- } else System . out . println ( "Overwriging file..." );
199-
205+ } else saveDocument ( openedFile );
206+ window . setTitle ( TITLE + " - saved" );
200207 }
201208 });
202209 m .add (saveFile );
203210 bar .add (m );
204211
205212 JMenu m2 = new JMenu ("Edit" );
213+ JMenuItem undo = new JMenuItem (getFormattedBarText ("Undo" ));
214+ undo .setAccelerator (KeyStroke .getKeyStroke ("control Z" ));
215+ undo .addActionListener (new ActionListener () {
216+ public void actionPerformed (ActionEvent e ) {
217+ if (historyIndex > 0 ) {
218+ historyIndex --;
219+ textArea .setText (history .get (historyIndex ));
220+ if (historyIndex == 0 ) undo .setEnabled (false );
221+ }
222+ }
223+ });
224+ undo .setEnabled (false );
225+ m2 .add (undo );
226+ m2 .addSeparator ();
227+ JMenuItem selectAll = new JMenuItem (getFormattedBarText ("Select All" ));
228+ selectAll .setAccelerator (KeyStroke .getKeyStroke ("control A" ));
229+ selectAll .addActionListener (new ActionListener () {
230+ public void actionPerformed (ActionEvent e ) {
231+ textArea .selectAll ();
232+ }
233+ });
234+ JMenuItem copyToClipboard = new JMenuItem (getFormattedBarText ("Copy" ));
235+ copyToClipboard .setAccelerator (KeyStroke .getKeyStroke ("control C" ));
236+ copyToClipboard .addActionListener (new ActionListener () {
237+ public void actionPerformed (ActionEvent e ) {
238+ Toolkit .getDefaultToolkit ().getSystemClipboard ().setContents (new StringSelection (textArea .getSelectedText ()),null );
239+ }
240+ });
241+ JMenuItem paste = new JMenuItem (getFormattedBarText ("Paste" ));
242+ paste .setAccelerator (KeyStroke .getKeyStroke ("control V" ));
243+ paste .addActionListener (new ActionListener () {
244+ public void actionPerformed (ActionEvent e ) {
245+ try {
246+ textArea .setText ((String ) Toolkit .getDefaultToolkit ().getSystemClipboard ().getData (DataFlavor .stringFlavor ));
247+ } catch (HeadlessException | UnsupportedFlavorException | IOException e1 ) {
248+ e1 .printStackTrace ();
249+ }
250+ }
251+ });
252+ m2 .add (selectAll );
253+ m2 .add (copyToClipboard );
254+ m2 .add (paste );
206255 bar .add (m2 );
207256
208257 JMenu m3 = new JMenu ("Run" );
@@ -222,10 +271,79 @@ public void actionPerformed(ActionEvent e) {
222271 m3 .add (run );
223272 bar .add (m3 );
224273
274+ JMenu m4 = new JMenu ("Help" );
275+ JMenuItem help = new JMenuItem ("Tutorial" );
276+ help .addActionListener (new ActionListener () {
277+ public void actionPerformed (ActionEvent e ) {
278+ ProcessBuilder pb = new ProcessBuilder ("Notepad.exe" , "README.md" );
279+ try {
280+ pb .start ();
281+ } catch (IOException e1 ) {
282+ e1 .printStackTrace ();
283+ }
284+ }
285+ });
286+ m4 .add (help );
287+ JMenuItem license = new JMenuItem ("License" );
288+ license .addActionListener (new ActionListener () {
289+ public void actionPerformed (ActionEvent e ) {
290+ ProcessBuilder pb = new ProcessBuilder ("Notepad.exe" , "LICENSE" );
291+ try {
292+ pb .start ();
293+ } catch (IOException e1 ) {
294+ e1 .printStackTrace ();
295+ }
296+ }
297+ });
298+ JMenuItem changelog = new JMenuItem ("Changelog" );
299+ changelog .addActionListener (new ActionListener () {
300+ public void actionPerformed (ActionEvent e ) {
301+ ProcessBuilder pb = new ProcessBuilder ("Notepad.exe" , "changelog.txt" );
302+ try {
303+ pb .start ();
304+ } catch (IOException e1 ) {
305+ e1 .printStackTrace ();
306+ }
307+ }
308+ });
309+ m4 .add (changelog );
310+ m4 .add (license );
311+ m4 .addSeparator ();
312+ JMenuItem about = new JMenuItem ("About / GitHub" );
313+ about .addActionListener (new ActionListener () {
314+ public void actionPerformed (ActionEvent arg0 ) {
315+ try {
316+ Desktop .getDesktop ().browse (new URI ("https://github.com/DevKevYT/devscript" ));
317+ } catch (IOException | URISyntaxException e ) {
318+ e .printStackTrace ();
319+ }
320+ }
321+ });
322+ m4 .add (about );
323+ m4 .addSeparator ();
324+ JMenuItem ty = new JMenuItem ("Thank you! <3" );
325+ ty .setEnabled (false );
326+ m4 .add (ty );
327+ bar .add (m4 );
328+
225329 window .setJMenuBar (bar );
226330
227331 textArea = new JTextPane ();
228332 textArea .setFont (font );
333+ textArea .addKeyListener (new KeyListener () {
334+ @ Override
335+ public void keyTyped (KeyEvent e ) {
336+ if (!e .isControlDown ()) window .setTitle (TITLE + " - unsaved" );
337+ }
338+ public void keyReleased (KeyEvent e ) {
339+ if (e .isControlDown ()) return ;
340+ history .add (textArea .getText ());
341+ if (history .size () >= 20 ) history .remove (0 );
342+ historyIndex = history .size ()-1 ;
343+ undo .setEnabled (true );
344+ }
345+ public void keyPressed (KeyEvent e ) {}
346+ });
229347 pane = new JScrollPane (textArea , JScrollPane .VERTICAL_SCROLLBAR_AS_NEEDED , JScrollPane .HORIZONTAL_SCROLLBAR_AS_NEEDED );
230348 pane .setBounds (5 , 5 , window .getRootPane ().getWidth () - 10 , window .getRootPane ().getHeight ()-bar .getHeight () - 10 );
231349 pane .setBorder (BorderFactory .createLineBorder (Color .BLACK ));
@@ -236,6 +354,16 @@ public void actionPerformed(ActionEvent e) {
236354 window .setSize (500 , 500 );
237355 }
238356
357+ private void saveDocument (File file ) {
358+ try {
359+ BufferedWriter writer = new BufferedWriter (new FileWriter (file ));
360+ writer .write (textArea .getText ());
361+ writer .close ();
362+ } catch (IOException e1 ) {
363+ e1 .printStackTrace ();
364+ }
365+ }
366+
239367 JFrame saveDialog ;
240368 JButton approveSave ;
241369 JButton cancelSave ;
0 commit comments