/********************************************************************* JavaPad Java-kielinen tekstieditori-sovellus, jossa on tekstikenttä ja valikkorivi. Valikkorivissa voi muokata fonttia, asettaa kirjoitus- suojauksen päälle ja pois sekä käyttää leikepöytätoimintoja. Leikepöytänä käytetään käyttöjärjestelmän leikepöytää. Tekijä: Pekka Malmirae 2/1999 *********************************************************************/ import java.awt.*; import java.awt.event.*; import java.awt.datatransfer.*; public class EditoriTesti { public static void main(String args[]) { PieniEditori editor = new PieniEditori(); editor.addWindowListener(new SuljeIkkuna()); } } class PieniEditori extends Frame implements ClipboardOwner { 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 MenuBar valikkopalkki; private Menu muotoilu_valikko, fontti_valikko, fkoko_valikko, muokkaa_valikko; private MenuItem fontti_taulukko[], koko_taulukko[], muokkaa_taulukko[]; private CheckboxMenuItem vain_luku; private String FONTTI = "TimesRoman"; private int FKOKO = 12; private String MUOKKAUS = ""; Clipboard leikepoyta; public PieniEditori() { super("Pieni Editori"); setSize(400, 300); leikepoyta = getToolkit().getSystemClipboard(); tekstialue = new TextArea("", 10, 20, TextArea.SCROLLBARS_VERTICAL_ONLY); 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"); fontti_taulukko = new MenuItem[fontit.length]; koko_taulukko = new MenuItem[fkoot.length]; muokkaa_taulukko = new MenuItem[muokkaa.length]; // 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(new ValikkoKasittelija()); } // 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(new ValikkoKasittelija()); } vain_luku = new CheckboxMenuItem("Kirjoitussuojattu"); vain_luku.addItemListener(new VainLukuKasittelija()); // lisätään valikot muotoilu_valikkoon 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(new ValikkoKasittelija()); } // lisätään valikot valikkopalkkiin valikkopalkki.add(muotoilu_valikko); valikkopalkki.add(muokkaa_valikko); setMenuBar(valikkopalkki); setVisible(true); } class ValikkoKasittelija implements ActionListener { public void actionPerformed(ActionEvent tapahtuma) { // 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; } } } // Käsitellään kirjoitussuojaus tekstialueeseen! class VainLukuKasittelija implements ItemListener { 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 ); } }