import java.awt.*; import java.awt.event.*; import java.awt.datatransfer.*; import java.io.*; /** * * @author Heikki */ public class MiniWord { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here { PieniEditori editor = new PieniEditori(); editor.addWindowListener(new SuljeIkkuna()); } } } class PieniEditori extends Frame implements ActionListener, ItemListener, ClipboardOwner, TextListener { private TextArea tekstialue; private String fontit[] = {"TimesRoman", "Courier", "Helvetica"}; private String fkoko_nimet[] = {"Pieni", "Normaali", "Suuri", "Extra Suuri"}; private String fkoot[] = {"8","12", "20", "40"}; private String muokkaa[] = {"Kopioi", "Leikkaa", "Liitä"}; private String tiedosto[] = {"Uusi", "Avaa...", "Tallenna..."}; private MenuBar valikkopalkki; private Menu muotoilu_valikko, fontti_valikko, fkoko_valikko, muokkaa_valikko, tiedosto_valikko; private MenuItem fontti_taulukko[], koko_taulukko[], muokkaa_taulukko[], tiedosto_taulukko[]; private CheckboxMenuItem vain_luku; private String FONTTI = "TimesRoman"; private int FKOKO = 12; private String MUOKKAUS = ""; private String TIEDOSTO = ""; private boolean TALLENNETTU = true; Clipboard leikepoyta; FileDialog fdAvaa; FileDialog fdTallenna; public PieniEditori() { super("Pieni Editori"); setSize(400, 300); leikepoyta = getToolkit().getSystemClipboard(); fdAvaa = new FileDialog(this, "Avaa tiedosto", FileDialog.LOAD); fdTallenna = new FileDialog(this, "Tallenna tiedosto", FileDialog.SAVE); tekstialue = new TextArea("", 10, 20, TextArea.SCROLLBARS_VERTICAL_ONLY); tekstialue.addTextListener(this); add(tekstialue, BorderLayout.CENTER); tekstialue.setFont(new Font("TimesRoman", Font.PLAIN, 12)); tekstialue.setForeground(Color.black); // luodaan valikot valikkopalkki = new MenuBar(); muotoilu_valikko= new Menu("Fontit"); fontti_valikko= new Menu("Tyyppi"); fkoko_valikko = new Menu("Koko"); muokkaa_valikko = new Menu("Muokkaa"); tiedosto_valikko = new Menu("Tiedosto"); fontti_taulukko = new MenuItem[fontit.length]; koko_taulukko = new MenuItem[fkoot.length]; muokkaa_taulukko = new MenuItem[muokkaa.length]; tiedosto_taulukko = new MenuItem[tiedosto.length]; // täytetään tiedosto_valikko ja lisätään sen alkioille tapahtumankäsittelijät for (int i = 0; i < tiedosto_taulukko.length; i++) { tiedosto_taulukko[i] = new MenuItem(tiedosto[i]); tiedosto_valikko.add(tiedosto_taulukko[i]); tiedosto_taulukko[i].addActionListener(this); } // täytetään fontti_valikko ja lisätään sen alkioille tapahtumankäsittelijät for (int i = 0; i < fontti_taulukko.length; i++) { fontti_taulukko[i] = new MenuItem(fontit[i]); fontti_valikko.add(fontti_taulukko[i]); fontti_taulukko[i].addActionListener(this); } // täytetään fkoko_valikko ja lisätään sen alkioille tapahtumankäsittelijät for (int i = 0; i < koko_taulukko.length; i++) { koko_taulukko[i] = new MenuItem(fkoko_nimet[i]); fkoko_valikko.add(koko_taulukko[i]); koko_taulukko[i].addActionListener(this); } // tehdään kirjoitussuojattu-alkio ja sille tap.kuuntelija vain_luku = new CheckboxMenuItem("Kirjoitussuojattu"); vain_luku.addItemListener(this); // kootaan muottoilu-valikko muotoilu_valikko.add(fontti_valikko); muotoilu_valikko.addSeparator(); muotoilu_valikko.add(fkoko_valikko); muotoilu_valikko.addSeparator(); muotoilu_valikko.add(vain_luku); // täytetään muokkaa_valikko ja lisätään sen alkioille tapahtumankäsittelijät for (int i = 0; i < muokkaa_taulukko.length; i++) { muokkaa_taulukko[i] = new MenuItem(muokkaa[i]); muokkaa_valikko.add(muokkaa_taulukko[i]); muokkaa_taulukko[i].addActionListener(this); } // lisätään valikot valikkopalkkiin valikkopalkki.add(tiedosto_valikko); valikkopalkki.add(muotoilu_valikko); valikkopalkki.add(muokkaa_valikko); setMenuBar(valikkopalkki); setVisible(true); } // Hoidetaan tekstin muuttumisen kuuntelu public void textValueChanged(TextEvent e) { TALLENNETTU = false; } // hoidetaan valikkotapahtumat public void actionPerformed(ActionEvent tapahtuma) { // tiedosto-valikon komentojen käsittely for (int i = 0; i < tiedosto_taulukko.length; i++) if (tapahtuma.getSource() == tiedosto_taulukko[i]) { TIEDOSTO = tiedosto_taulukko[i].getLabel(); if (TIEDOSTO == "Uusi") uusiTiedosto(); else if (TIEDOSTO == "Avaa...") avaaTiedosto(); else if (TIEDOSTO == "Tallenna...") tallennaTiedosto(); break; } // vaihdetaan fonttia, säilytetään aikaisempi kokotieto for (int i = 0; i < fontti_taulukko.length; i++) if (tapahtuma.getSource() == fontti_taulukko[i]) { FONTTI = fontti_taulukko[i].getLabel(); tekstialue.setFont(new Font(FONTTI, Font.PLAIN, FKOKO)); break; } // vaihdetaan fonttikokoa, säilytetään aikaisempi fonttitieto for (int i = 0; i < koko_taulukko.length; i++) if (tapahtuma.getSource() == koko_taulukko[i]) { FKOKO = new Integer(fkoot[i]).intValue(); tekstialue.setFont(new Font(FONTTI, Font.PLAIN, FKOKO)); break; } // muokkaa-valikon komentojen käsittely for (int i = 0; i < muokkaa_taulukko.length; i++) if (tapahtuma.getSource() == muokkaa_taulukko[i]) { MUOKKAUS = muokkaa_taulukko[i].getLabel(); if (MUOKKAUS == "Kopioi") laita_leikepoydalle(false); else if (MUOKKAUS == "Leikkaa") laita_leikepoydalle(true); else if (MUOKKAUS == "Liitä") ota_leikepoydalta(); break; } } // jos tiedostoa ei ole tallennettu, tallennetaan... // sen jälkeen tyhjennetään tekstialue public void uusiTiedosto() { if (!TALLENNETTU) tallennaTiedosto(); tekstialue.setText(""); TALLENNETTU = true; } // Tyhjennetään tekstialue ja avataan dialogi // jos käyttäjä valitsee tiedoston, avataan se // ja luetaan se char[]-puskuriin // muutetaan puskuri merkkijonoksi ja kirjoitetaan // se rivi kerrallaan tekstialueeseen public void avaaTiedosto() { uusiTiedosto(); fdAvaa.show(); if (fdAvaa.getFile() != null) { try { File tied = new File(fdAvaa.getDirectory() + fdAvaa.getFile()); BufferedReader lukija = new BufferedReader(new FileReader(tied)); int pituus = (new Long(tied.length())).intValue(); char teksti[] = new char[pituus]; lukija.read(teksti, 0, pituus-1); String merkkijono = new String(teksti); String rivi = ""; int i = merkkijono.indexOf("\n"); while ( i != -1) { rivi = merkkijono.substring(0,i-1); merkkijono = merkkijono.substring(i+1); tekstialue.append(rivi + "\n"); i = merkkijono.indexOf("\n"); } tekstialue.append(merkkijono.substring(0, merkkijono.length()-2)); }catch (Exception e) { e.printStackTrace(); } TALLENNETTU = true; } } // toimii käänteisesti edelliseen verrattuna. // jos käyttäjä valitsee tiedoston, kirjoitetaan // tekstialueen teksti rivi kerrallaan tiedostoon public void tallennaTiedosto() { fdTallenna.show(); if (fdTallenna.getFile() != null) { try { File tied = new File(fdTallenna.getDirectory() + fdTallenna.getFile()); FileOutputStream tulos = new FileOutputStream(tied); PrintWriter tulostus = new PrintWriter(tulos, true); String merkkijono = tekstialue.getText(); String rivi = ""; int i = merkkijono.indexOf("\n"); while ( i != -1) { rivi = merkkijono.substring(0,i); merkkijono = merkkijono.substring(i+1); tulostus.println(rivi); i = merkkijono.indexOf("\n"); } tulostus.println(merkkijono); tulos.close(); } catch (Exception e) { e.printStackTrace(); } TALLENNETTU = true; } } // Käsitellään kirjoitussuojaus tekstialueeseen! public void itemStateChanged(ItemEvent tapahtuma) { tekstialue.setEditable(!tekstialue.isEditable()); } public void lostOwnership(Clipboard leikepoyta, Transferable contents) {} // Laitetaan valittu teksti leikepöydälle. // Jos cut=true, valittu teksti pyyhitään. private void laita_leikepoydalle(boolean cut) { String kopioitu_teksti = null; kopioitu_teksti = tekstialue.getSelectedText(); if (kopioitu_teksti != null) leikepoyta.setContents(new StringSelection(kopioitu_teksti), this); if (cut) tekstialue.replaceRange("", tekstialue.getSelectionStart(), tekstialue.getSelectionEnd()); } // Lisätään kursorin kohdalle leikepöydällä oleva teksti private void ota_leikepoydalta() { Transferable leikepoytaData = leikepoyta.getContents(this); if (leikepoytaData != null && tekstialue.isEditable()) { try { String liitaTeksti = (String)leikepoytaData.getTransferData(DataFlavor.stringFlavor); tekstialue.insert(liitaTeksti, tekstialue.getCaretPosition()); } catch (Exception e) { e.printStackTrace(); } } } } // PieniEditori loppuu class SuljeIkkuna extends WindowAdapter { public void windowClosing(WindowEvent tapahtuma) { System.exit( 0 ); } }