/* * Copyright (C) 2010, 2011 IsmAvatar <IsmAvatar@gmail.com> * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package org.lateralgm.subframes; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.MessageFormat; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import org.lateralgm.components.CodeTextArea; import org.lateralgm.components.MarkerCache; import org.lateralgm.components.impl.TextAreaFocusTraversalPolicy; import org.lateralgm.components.mdi.RevertableMDIFrame; import org.lateralgm.main.LGM; public class CodeFrame extends RevertableMDIFrame implements ActionListener { private static final long serialVersionUID = 1L; public interface CodeHolder { String getCode(); void setCode(String s); } public final CodeHolder codeHolder; public final JToolBar tool; public final CodeTextArea code; public final JPanel status; private final String titleFormat; private final JButton save; public CodeFrame(CodeHolder codeHolder, String titleFormat, Object titleArg) { super(MessageFormat.format(titleFormat,titleArg),true,true,true,true); this.setFrameIcon(LGM.getIconForKey("Resource.SCR")); this.codeHolder = codeHolder; this.titleFormat = titleFormat; setSize(700,430); tool = new JToolBar(); tool.setFloatable(false); tool.setAlignmentX(0); save = new JButton(LGM.getIconForKey("ResourceFrame.SAVE")); //$NON-NLS-1$ save.addActionListener(this); tool.add(save); tool.addSeparator(); code = new CodeTextArea(codeHolder.getCode(),MarkerCache.getMarker("gml")); code.addEditorButtons(tool); status = new JPanel(new FlowLayout()); status.setLayout(new BoxLayout(status,BoxLayout.X_AXIS)); status.setMaximumSize(new Dimension(Integer.MAX_VALUE,11)); final JLabel caretPos = new JLabel(" INS | UTF-8 | " + (code.getCaretLine() + 1) + " : " + (code.getCaretColumn() + 1)); status.add(caretPos); code.addCaretListener(new CaretListener() { public void caretUpdate(CaretEvent e) { caretPos.setText(" INS | UTF-8 | " + (code.getCaretLine() + 1) + ":" + (code.getCaretColumn() + 1)); } }); add(tool,BorderLayout.NORTH); add(code,BorderLayout.CENTER); add(status,BorderLayout.SOUTH); setFocusTraversalPolicy(new TextAreaFocusTraversalPolicy(code.text)); SubframeInformer.fireSubframeAppear(this,false); } public void setTitleFormatArg(Object titleArg) { setTitle(MessageFormat.format(titleFormat,titleArg)); } public void commitChanges() { codeHolder.setCode(code.getTextCompat()); } public void actionPerformed(ActionEvent e) { //save button clicked, commit changes because our resourceChanged() method does not updateResource(true); close(); } @Override public String getConfirmationName() { return getTitle(); } //updatable only, no revert @Override public boolean resourceChanged() { return code.isChanged(); } @Override public void revertResource() { //updatable only, no revert } @Override public void updateResource(boolean commit) { //NOTE: Ignore commit parameter, this is simply a flag to let us know if //resourceChanged() was called recently as some resources commit before //checking changes and we want to avoid resources committing twice. commitChanges(); } @Override public void setResourceChanged() { // TODO: Discussion should be held about closing associated windows. } }