import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.event.*; class FJTextPane extends JTextPane{ //Sama mis JTextPane aga lisaks hoitakse sellel veel välju täieliku ja tavalise failinimega String fileName=null; String shortName=null; } class TextSwing3 implements ActionListener,ChangeListener,Runnable{ /*Globaalsed muutujad*/ JTabbedPane tp=new JTabbedPane(); JPanel content=new JPanel(new BorderLayout()); String Path="D:"; int loendur=0; //Globaalsed muutujad on teadagi head sellepärast, et on igalt poolt kättesaadavad /*Konstruktor*/ public TextSwing3(){ tp.addChangeListener(this); } /*Menüü*/ //kogu see jura kuni Failioperatsioonideni tekitab kõik menüüd public JMenuBar createMenuBar(){ JMenuBar mb=new JMenuBar(); mb.add(createFileMenu("Fail")); mb.add(createEditMenu("Redigeeri")); mb.add(createSettingsMenu("Seaded")); return mb; } public JMenu createFileMenu(String s){ JMenu m=new JMenu(s); this.addItem(m,"Uus"); this.addItem(m,"Ava"); this.addItem(m,"Salvesta"); this.addItem(m,"Salvesta Kui"); this.addItem(m,"Sulge"); m.addSeparator(); this.addItem(m,"Välju"); return m; } public JMenu createEditMenu(String s){ JMenu m=new JMenu(s); this.addItem(m,"Kopeeri"); this.addItem(m,"Lõika"); this.addItem(m,"Aseta"); this.addItem(m,"Märgi kõik"); return m; } public JMenu createSettingsMenu(String s){ JMenu m=new JMenu(s); this.addItem(m,"Kaust"); return m; } public void addItem(JMenu m,String s){ JMenuItem mi=new JMenuItem(s); mi.addActionListener(this); m.add(mi); } public void actionPerformed(ActionEvent e){ /*Failimenüü*/ if(e.getActionCommand()=="Uus"){ tabManager(null,null,1,"");//uus tühi tab } if(e.getActionCommand()=="Ava"){ File myFile=openFile(true);//vt openFile Failioperatsioonide alt if(myFile!=null){ tabManager(myFile.getName(),myFile.getAbsolutePath(),1,loadFile(myFile.getAbsolutePath())); } } if(e.getActionCommand()=="Sulge"){ tabManager(null,null,0,"");//tabManager ikka üks kaval jublakas, kas pole;) } if(e.getActionCommand()=="Salvesta"){ /*Siin tehakse nüüd kõvasti tüübiteisendusi, et JTabbedPane'i pealt lõpuks see tekstiväli kätte saada*/ JScrollPane cache=(JScrollPane)tp.getSelectedComponent(); JViewport cache2=(JViewport)cache.getComponent(0); FJTextPane kompu=(FJTextPane)cache2.getComponent(0); if(kompu.fileName!=null){ saveFile(null); }else{ File newFile=openFile(false); if(newFile!=null){ int index=tp.getSelectedIndex(); tp.setTitleAt(index,newFile.getName());//tab'i nimeks saab salvestatud faili nimi saveFile(newFile.getAbsolutePath());//salvestamiseks on vaja faili täielikku nime } } } if(e.getActionCommand()=="Salvesta Kui"){//sarnane eelmisele File newFile=openFile(false); if(newFile!=null){ int index=tp.getSelectedIndex(); tp.setTitleAt(index,newFile.getName()); saveFile(newFile.getAbsolutePath()); } } if(e.getActionCommand()=="Välju"){ System.exit(0);//teadagi, mis } /*Redigeerimismenüü*/ if(e.getActionCommand()=="Kopeeri"){ /*Siin, nagu ka allpool on tegemist selle sama asjaga mis ülevalgi - eesmärk pääseda tekstialale ligi*/ JScrollPane cache=(JScrollPane)tp.getSelectedComponent(); JViewport cache2=(JViewport)cache.getComponent(0); FJTextPane kompu=(FJTextPane)cache2.getComponent(0); kompu.copy();//kas java ja swing pole imeliselt lihtne:D } if(e.getActionCommand()=="Lõika"){ JScrollPane cache=(JScrollPane)tp.getSelectedComponent(); JViewport cache2=(JViewport)cache.getComponent(0); FJTextPane kompu=(FJTextPane)cache2.getComponent(0); kompu.cut(); } if(e.getActionCommand()=="Aseta"){ JScrollPane cache=(JScrollPane)tp.getSelectedComponent(); JViewport cache2=(JViewport)cache.getComponent(0); FJTextPane kompu=(FJTextPane)cache2.getComponent(0); kompu.paste(); } if(e.getActionCommand()=="Märgi kõik"){ JScrollPane cache=(JScrollPane)tp.getSelectedComponent(); JViewport cache2=(JViewport)cache.getComponent(0); FJTextPane kompu=(FJTextPane)cache2.getComponent(0); kompu.selectAll(); } /*Seadete menüü*/ if(e.getActionCommand()=="Kaust"){ String temp=(String)JOptionPane.showInputDialog("Uus vaikimisi kaust: \n",Path); if(temp!=null && temp.length()>0){ Path=temp; return; } } } /*Failioperatsioonid*/ public File openFile(boolean b){//boolean on selleks hea, et seda sama meetodit kasutada nii avamise kui ka salvestamise dialoogi näitamiseks JFileChooser fc=new JFileChooser(Path); int returnVal; if(b){returnVal=fc.showOpenDialog(content);} else {returnVal=fc.showSaveDialog(content);} if(returnVal==JFileChooser.APPROVE_OPTION){//kui saadakse positiivne vastus(Yes, Ok, vms) return fc.getSelectedFile(); }else return null; } public String loadFile(String fileName){ String s=new String(); try{ BufferedReader br=new BufferedReader(new FileReader(fileName)); StringBuffer sb=new StringBuffer(); char [] buffer=new char[10]; while(br.ready()){ int len=br.read(buffer,0,10); if(len==-1) break; sb.append(buffer,0,len); } br.close(); s=sb.toString(); }catch(Exception e){System.out.println("Probleem: "+e);} return s; } public void saveFile(String newName){ try{ JScrollPane cache=(JScrollPane)tp.getSelectedComponent(); JViewport cache2=(JViewport)cache.getComponent(0); FJTextPane kompu=(FJTextPane)cache2.getComponent(0); if(newName!=null){ kompu.fileName=newName; } String text=kompu.getText(); BufferedWriter bw=new BufferedWriter(new FileWriter(kompu.fileName)); bw.write(text,0,text.length()); bw.close(); }catch(Exception e){System.out.println("Probleem: "+e);} } /*Muu kama*/ public void stateChanged(ChangeEvent e){ new Thread(this).start(); } public void run(){// pausi vajatakse, kuna muidu tahab java fookust panna nii kiiresti, et arvuti ei jõua veel seda asja mällu lugeda ja nii jääks muidu fookus panemata try{Thread.sleep(500);}catch(Exception e){} JScrollPane cache=(JScrollPane)tp.getSelectedComponent(); JViewport cache2=(JViewport)cache.getComponent(0); FJTextPane kompu=(FJTextPane)cache2.getComponent(0); kompu.requestFocus(); } public void tabManager(String shortName,String fileName, int a, String s){ if(a==1){ if(shortName==null){ loendur++; shortName="Nimetu"+(loendur); } FJTextPane ep=new FJTextPane(); //tegelikult pannakse tekstiala ScrollPane'i peale ja ScrollPane TabbedPane'i peale JScrollPane sp=new JScrollPane(ep);//ScrollPane on hea selleks, et kerimisribad tekiksid sp.setPreferredSize(new Dimension(640,480)); ep.setContentType("text/plain"); ep.shortName=shortName; ep.fileName=fileName; ep.setText(s); tp.addTab(shortName,sp); tp.setSelectedIndex(tp.getTabCount()-1); }else{// tabManager oskab ka tab'e eemaldada tp.remove(tp.getSelectedIndex()); } } /*Põhiosa*/ public Container createContentPane(){ tabManager(null,null,1,""); //JTabbedPane'i peale lisatakse üks tühi ja nimetu tab content.add(tp, BorderLayout.CENTER);//content'ile lisatakse JTabbedPane return content; } public static void main(String Args[]){ JFrame.setDefaultLookAndFeelDecorated(true);//sellega kindlustatakse vaikimisi väljanägemine JFrame aken=new JFrame("Wäike-Wörd"); aken.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//et nn X-st kinni saaks panna TextSwing3 ts=new TextSwing3(); //uus isend iseendast:) aken.setJMenuBar(ts.createMenuBar());//akna menüüks saab createMenuBar'i poolt tagastatav JMenuBar aken.setContentPane(ts.createContentPane());//Swingis asub kogu aknasisu ContentPane'i peal aken.setSize(640,480); aken.setLocation(100,100); aken.show(); } }