Tutorial Pembuatan Simple Editor Text Menggunakan JAVA

Hai guys, kali ini saya akan mencoba memberikan sesuatu tutorial tentang cara membuat editor kaya notepad, gmn guys keren kan... loe bisa punya editor yang bisa loe rubah rubah dan tambahkan fungsi sesuka loe semua.

nah guys berikut video tutorial tentang cara pembuatan editor ini, layout merupakan hasil karya bertapa ane dari gunung sumbang wahaha *oke yg ini ngarang



oke langsung saja guys cek video tutorialnya :



Code :

1:  package editor.with.i;  
2:    
3:  import java.awt.Font;  
4:  import java.io.FileReader;  
5:  import java.io.FileWriter;  
6:  import java.io.IOException;  
7:  import javax.swing.ActionMap;  
8:  import javax.swing.JFileChooser;  
9:  import javax.swing.JOptionPane;  
10:  /*  
11:   * To change this template, choose Tools | Templates  
12:   * and open the template in the editor.  
13:   */  
14:    
15:  /**  
16:   *  
17:   * @author Fana Barkah A  
18:   */  
19:  public class NotewithI extends javax.swing.JFrame {  
20:    private String editor;  
21:    final private String nameApp = "Program Notepad Tentative";  
22:    private String currentFile = "Untitled";  
23:    private boolean changed = false;  
24:    final private JFileChooser dialog = new JFileChooser(System.getProperty("user.dir"));  
25:    ActionMap m;  
26:    
27:    public NotewithI() {  
28:      initComponents();  
29:      setTitle(nameApp);  
30:      setLocationRelativeTo(this);  
31:    }  
32:    
33:    /**  
34:     * This method is called from within the constructor to initialize the form.  
35:     * WARNING: Do NOT modify this code. The content of this method is always  
36:     * regenerated by the Form Editor.  
37:     */  
38:    @SuppressWarnings("unchecked")  
39:    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents  
40:    private void initComponents() {  
41:    
42:      jSeparator1 = new javax.swing.JSeparator();  
43:      jScrollPane1 = new javax.swing.JScrollPane();  
44:      textEditor = new javax.swing.JTextArea();  
45:      jToolBar2 = new javax.swing.JToolBar();  
46:      Save = new javax.swing.JButton();  
47:      Saveas = new javax.swing.JButton();  
48:      jSeparator2 = new javax.swing.JToolBar.Separator();  
49:      Cut = new javax.swing.JButton();  
50:      Copy = new javax.swing.JButton();  
51:      Paste = new javax.swing.JButton();  
52:      jSeparator3 = new javax.swing.JToolBar.Separator();  
53:      Larger = new javax.swing.JButton();  
54:      Smaller = new javax.swing.JButton();  
55:      jMenuBar1 = new javax.swing.JMenuBar();  
56:      MenuFile = new javax.swing.JMenu();  
57:      MenuNew = new javax.swing.JMenuItem();  
58:      MenuOpen = new javax.swing.JMenuItem();  
59:      MenuSave = new javax.swing.JMenuItem();  
60:      jMenuItem2 = new javax.swing.JMenuItem();  
61:      MenuExit = new javax.swing.JMenuItem();  
62:      jMenu2 = new javax.swing.JMenu();  
63:      jMenuItem1 = new javax.swing.JMenuItem();  
64:    
65:      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
66:      addWindowListener(new java.awt.event.WindowAdapter() {  
67:        public void windowClosing(java.awt.event.WindowEvent evt) {  
68:          formWindowClosing(evt);  
69:        }  
70:      });  
71:    
72:      textEditor.setColumns(20);  
73:      textEditor.setRows(5);  
74:      textEditor.addKeyListener(new java.awt.event.KeyAdapter() {  
75:        public void keyPressed(java.awt.event.KeyEvent evt) {  
76:          textEditorKeyPressed(evt);  
77:        }  
78:      });  
79:      jScrollPane1.setViewportView(textEditor);  
80:    
81:      jToolBar2.setRollover(true);  
82:    
83:      Save.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/iconbtn/save.png"))); // NOI18N  
84:      Save.setText("Save");  
85:      Save.setToolTipText("Save your file");  
86:      Save.setEnabled(false);  
87:      Save.setFocusable(false);  
88:      Save.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);  
89:      Save.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);  
90:      Save.addActionListener(new java.awt.event.ActionListener() {  
91:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
92:          SaveActionPerformed(evt);  
93:        }  
94:      });  
95:      jToolBar2.add(Save);  
96:    
97:      Saveas.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/iconbtn/saveas.png"))); // NOI18N  
98:      Saveas.setText("Save As");  
99:      Saveas.setToolTipText("Save As your file");  
100:      Saveas.setEnabled(false);  
101:      Saveas.setFocusable(false);  
102:      Saveas.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);  
103:      Saveas.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);  
104:      Saveas.addActionListener(new java.awt.event.ActionListener() {  
105:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
106:          SaveasActionPerformed(evt);  
107:        }  
108:      });  
109:      jToolBar2.add(Saveas);  
110:      jToolBar2.add(jSeparator2);  
111:    
112:      Cut.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/iconbtn/cut.gif"))); // NOI18N  
113:      Cut.setText("Cut");  
114:      Cut.setToolTipText("Cut text from editor");  
115:      Cut.setFocusable(false);  
116:      Cut.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);  
117:      Cut.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);  
118:      Cut.addActionListener(new java.awt.event.ActionListener() {  
119:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
120:          CutActionPerformed(evt);  
121:        }  
122:      });  
123:      jToolBar2.add(Cut);  
124:    
125:      Copy.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/iconbtn/copy.png"))); // NOI18N  
126:      Copy.setText("Copy");  
127:      Copy.setFocusable(false);  
128:      Copy.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);  
129:      Copy.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);  
130:      Copy.addActionListener(new java.awt.event.ActionListener() {  
131:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
132:          CopyActionPerformed(evt);  
133:        }  
134:      });  
135:      jToolBar2.add(Copy);  
136:    
137:      Paste.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/iconbtn/paste.png"))); // NOI18N  
138:      Paste.setText("Paste");  
139:      Paste.setToolTipText("Paste from clipboard");  
140:      Paste.setFocusable(false);  
141:      Paste.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);  
142:      Paste.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);  
143:      Paste.addActionListener(new java.awt.event.ActionListener() {  
144:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
145:          PasteActionPerformed(evt);  
146:        }  
147:      });  
148:      jToolBar2.add(Paste);  
149:      jToolBar2.add(jSeparator3);  
150:    
151:      Larger.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/iconbtn/plus.png"))); // NOI18N  
152:      Larger.setText("Larger");  
153:      Larger.setToolTipText("Larger your text");  
154:      Larger.setFocusable(false);  
155:      Larger.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);  
156:      Larger.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);  
157:      Larger.addActionListener(new java.awt.event.ActionListener() {  
158:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
159:          LargerActionPerformed(evt);  
160:        }  
161:      });  
162:      jToolBar2.add(Larger);  
163:    
164:      Smaller.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/iconbtn/minus.png"))); // NOI18N  
165:      Smaller.setText("Smaller");  
166:      Smaller.setToolTipText("Smaller your text");  
167:      Smaller.setFocusable(false);  
168:      Smaller.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);  
169:      Smaller.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);  
170:      Smaller.addActionListener(new java.awt.event.ActionListener() {  
171:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
172:          SmallerActionPerformed(evt);  
173:        }  
174:      });  
175:      jToolBar2.add(Smaller);  
176:    
177:      MenuFile.setText("File");  
178:      MenuFile.addActionListener(new java.awt.event.ActionListener() {  
179:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
180:          MenuFileActionPerformed(evt);  
181:        }  
182:      });  
183:    
184:      MenuNew.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));  
185:      MenuNew.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/new.jpg"))); // NOI18N  
186:      MenuNew.setText("New");  
187:      MenuNew.addActionListener(new java.awt.event.ActionListener() {  
188:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
189:          MenuNewActionPerformed(evt);  
190:        }  
191:      });  
192:      MenuFile.add(MenuNew);  
193:    
194:      MenuOpen.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));  
195:      MenuOpen.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/open.jpg"))); // NOI18N  
196:      MenuOpen.setText("Open");  
197:      MenuOpen.addActionListener(new java.awt.event.ActionListener() {  
198:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
199:          MenuOpenActionPerformed(evt);  
200:        }  
201:      });  
202:      MenuFile.add(MenuOpen);  
203:    
204:      MenuSave.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));  
205:      MenuSave.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/save.jpg"))); // NOI18N  
206:      MenuSave.setText("Save ");  
207:      MenuSave.addActionListener(new java.awt.event.ActionListener() {  
208:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
209:          MenuSaveActionPerformed(evt);  
210:        }  
211:      });  
212:      MenuFile.add(MenuSave);  
213:    
214:      jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));  
215:      jMenuItem2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/iconbtn/saveas.png"))); // NOI18N  
216:      jMenuItem2.setText("Save As");  
217:      jMenuItem2.addActionListener(new java.awt.event.ActionListener() {  
218:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
219:          jMenuItem2ActionPerformed(evt);  
220:        }  
221:      });  
222:      MenuFile.add(jMenuItem2);  
223:    
224:      MenuExit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK));  
225:      MenuExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/exit.jpg"))); // NOI18N  
226:      MenuExit.setText("Exit");  
227:      MenuExit.addActionListener(new java.awt.event.ActionListener() {  
228:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
229:          MenuExitActionPerformed(evt);  
230:        }  
231:      });  
232:      MenuFile.add(MenuExit);  
233:    
234:      jMenuBar1.add(MenuFile);  
235:    
236:      jMenu2.setText("About");  
237:    
238:      jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));  
239:      jMenuItem1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/about.jpg"))); // NOI18N  
240:      jMenuItem1.setText("The Creator");  
241:      jMenuItem1.addActionListener(new java.awt.event.ActionListener() {  
242:        public void actionPerformed(java.awt.event.ActionEvent evt) {  
243:          jMenuItem1ActionPerformed(evt);  
244:        }  
245:      });  
246:      jMenu2.add(jMenuItem1);  
247:    
248:      jMenuBar1.add(jMenu2);  
249:    
250:      setJMenuBar(jMenuBar1);  
251:    
252:      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());  
253:      getContentPane().setLayout(layout);  
254:      layout.setHorizontalGroup(  
255:        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
256:        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 1019, Short.MAX_VALUE)  
257:        .addComponent(jToolBar2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)  
258:      );  
259:      layout.setVerticalGroup(  
260:        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
261:        .addGroup(layout.createSequentialGroup()  
262:          .addComponent(jToolBar2, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE)  
263:          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)  
264:          .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 544, javax.swing.GroupLayout.PREFERRED_SIZE))  
265:      );  
266:    
267:      pack();  
268:    }// </editor-fold>//GEN-END:initComponents  
269:    
270:    private void MenuNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MenuNewActionPerformed  
271:      NewNotepad();  
272:    }//GEN-LAST:event_MenuNewActionPerformed  
273:    
274:    private void MenuOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MenuOpenActionPerformed  
275:      openFile();  
276:         
277:    }//GEN-LAST:event_MenuOpenActionPerformed  
278:    
279:    private void MenuSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MenuSaveActionPerformed  
280:      if(!currentFile.equals("Untitled"))  
281:          saveFile(currentFile);  
282:      else  
283:          saveFileAs();  
284:    }//GEN-LAST:event_MenuSaveActionPerformed  
285:    
286:    private void MenuFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MenuFileActionPerformed  
287:        
288:    }//GEN-LAST:event_MenuFileActionPerformed  
289:    
290:    private void MenuExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MenuExitActionPerformed  
291:      System.exit(0);  
292:    }//GEN-LAST:event_MenuExitActionPerformed  
293:    
294:    private void SaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveActionPerformed  
295:      if(!currentFile.equals("Untitled"))  
296:          saveFile(currentFile);  
297:      else  
298:          saveFileAs();  
299:    }//GEN-LAST:event_SaveActionPerformed  
300:    
301:    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed  
302:      saveFileAs();  
303:    }//GEN-LAST:event_jMenuItem2ActionPerformed  
304:    
305:    private void SaveasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveasActionPerformed  
306:      saveFileAs();  
307:    }//GEN-LAST:event_SaveasActionPerformed  
308:    
309:    private void textEditorKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_textEditorKeyPressed  
310:      changed = true;  
311:      Save.setEnabled(true);  
312:      Saveas.setEnabled(true);  
313:    }//GEN-LAST:event_textEditorKeyPressed  
314:    
315:    private void CutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CutActionPerformed  
316:      textEditor.cut();  
317:    }//GEN-LAST:event_CutActionPerformed  
318:    
319:    private void CopyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CopyActionPerformed  
320:      textEditor.copy();  
321:    }//GEN-LAST:event_CopyActionPerformed  
322:    
323:    private void PasteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PasteActionPerformed  
324:      textEditor.paste();  
325:    }//GEN-LAST:event_PasteActionPerformed  
326:    
327:    private void LargerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LargerActionPerformed  
328:      Font f = new Font(textEditor.getFont().getFontName(), textEditor.getFont().getStyle(), textEditor.getFont().getSize() + 1);  
329:      textEditor.setFont(f);  
330:    }//GEN-LAST:event_LargerActionPerformed  
331:    
332:    private void SmallerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SmallerActionPerformed  
333:      Font f = new Font(textEditor.getFont().getFontName(), textEditor.getFont().getStyle(), textEditor.getFont().getSize() - 1);  
334:      textEditor.setFont(f);  
335:    }//GEN-LAST:event_SmallerActionPerformed  
336:    
337:    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing  
338:      saveOld();  
339:    }//GEN-LAST:event_formWindowClosing  
340:    
341:    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed  
342:      JOptionPane.showMessageDialog(this,"Email me for suggestion : fanabarkah@students.itb.ac.id");  
343:    }//GEN-LAST:event_jMenuItem1ActionPerformed  
344:    
345:    /**  
346:     * @param args the command line arguments  
347:     */  
348:    private void NewNotepad()  
349:    {  
350:      textEditor.setText("");  
351:      currentFile = "Untitled";  
352:      setTitle(nameApp + " - " + currentFile);  
353:    }  
354:      
355:    public void openFile() {  
356:      saveOld();  
357:      if(dialog.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) {  
358:          readInFile(dialog.getSelectedFile().getAbsolutePath());  
359:      }  
360:      Saveas.setEnabled(true);  
361:    }  
362:      
363:    private void readInFile(String fileName) {  
364:      try {  
365:        try (FileReader r = new FileReader(fileName)) {  
366:          textEditor.read(r,null);  
367:        }  
368:          currentFile = fileName;  
369:          setTitle(nameApp + " - " + currentFile);  
370:          changed = false;  
371:      }  
372:      catch(IOException e) {  
373:          getToolkit().beep();  
374:          JOptionPane.showMessageDialog(this,"Editor can't find the file called "+fileName);  
375:      }  
376:    }  
377:      
378:    private void saveOld() {  
379:      if(changed) {  
380:        if(JOptionPane.showConfirmDialog(this, "Would you like to save "+ currentFile +" ?","Save",JOptionPane.YES_NO_OPTION)== JOptionPane.YES_OPTION)  
381:            saveFile(currentFile);  
382:      }  
383:    }  
384:        
385:    private void saveFileAs() {  
386:            if(dialog.showSaveDialog(null)==JFileChooser.APPROVE_OPTION)  
387:                 saveFile(dialog.getSelectedFile().getAbsolutePath());  
388:       }  
389:      
390:    private void saveFile(String fileName) {  
391:            try {  
392:            try (FileWriter w = new FileWriter(fileName)) {  
393:              textEditor.write(w);  
394:            }  
395:                 currentFile = fileName;  
396:                 setTitle(nameApp + " - " + currentFile);  
397:                 changed = false;  
398:                 Save.setEnabled(false);  
399:            }  
400:            catch(IOException e) {  
401:            }  
402:       }  
403:      
404:    public static void main(String args[]) {  
405:      /* Set the Nimbus look and feel */  
406:      //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">  
407:      /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.  
408:       * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html   
409:       */  
410:      try {  
411:        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {  
412:          if ("Nimbus".equals(info.getName())) {  
413:            javax.swing.UIManager.setLookAndFeel(info.getClassName());  
414:            break;  
415:          }  
416:        }  
417:      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {  
418:        java.util.logging.Logger.getLogger(NotewithI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
419:      }  
420:      //</editor-fold>  
421:    
422:      /* Create and display the form */  
423:      java.awt.EventQueue.invokeLater(new Runnable() {  
424:        @Override  
425:        public void run() {  
426:          new NotewithI().setVisible(true);  
427:        }  
428:      });  
429:    }  
430:      
431:    // Variables declaration - do not modify//GEN-BEGIN:variables  
432:    private javax.swing.JButton Copy;  
433:    private javax.swing.JButton Cut;  
434:    private javax.swing.JButton Larger;  
435:    private javax.swing.JMenuItem MenuExit;  
436:    private javax.swing.JMenu MenuFile;  
437:    private javax.swing.JMenuItem MenuNew;  
438:    private javax.swing.JMenuItem MenuOpen;  
439:    private javax.swing.JMenuItem MenuSave;  
440:    private javax.swing.JButton Paste;  
441:    private javax.swing.JButton Save;  
442:    private javax.swing.JButton Saveas;  
443:    private javax.swing.JButton Smaller;  
444:    private javax.swing.JMenu jMenu2;  
445:    private javax.swing.JMenuBar jMenuBar1;  
446:    private javax.swing.JMenuItem jMenuItem1;  
447:    private javax.swing.JMenuItem jMenuItem2;  
448:    private javax.swing.JScrollPane jScrollPane1;  
449:    private javax.swing.JSeparator jSeparator1;  
450:    private javax.swing.JToolBar.Separator jSeparator2;  
451:    private javax.swing.JToolBar.Separator jSeparator3;  
452:    private javax.swing.JToolBar jToolBar2;  
453:    private javax.swing.JTextArea textEditor;  
454:    // End of variables declaration//GEN-END:variables  
455:  }  
456:    

2 komentar:

Posting Komentar

Ayo Celotehnya tulis disini yaaa....