summaryrefslogtreecommitdiffstats
path: root/logo/src/xlogo/gui/translation/MyTable.java
diff options
context:
space:
mode:
authorMarko Živković <[email protected]>2014-06-11 10:10:33 +0000
committerMarko Živković <[email protected]>2014-06-11 10:10:33 +0000
commit1107aa0763e3d7554408c401d2a1dbed11a94c51 (patch)
tree7074264bc7b63f2ee5ee14a39458380fcce1904b /logo/src/xlogo/gui/translation/MyTable.java
Add initial directories and files
git-svn-id: https://svn.code.sf.net/p/xlogo4schools/svn/trunk@1 3b0d7934-f7ef-4143-9606-b51f2e2281fd
Diffstat (limited to 'logo/src/xlogo/gui/translation/MyTable.java')
-rw-r--r--logo/src/xlogo/gui/translation/MyTable.java375
1 files changed, 375 insertions, 0 deletions
diff --git a/logo/src/xlogo/gui/translation/MyTable.java b/logo/src/xlogo/gui/translation/MyTable.java
new file mode 100644
index 0000000..9976a09
--- /dev/null
+++ b/logo/src/xlogo/gui/translation/MyTable.java
@@ -0,0 +1,375 @@
+/* XLogo4Schools - A Logo Interpreter specialized for use in schools, based on XLogo by Lo�c Le Coq
+ * Copyright (C) 2013 Marko Zivkovic
+ *
+ * Contact Information: marko88zivkovic at gmail dot com
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details. You should have received a copy of the
+ * GNU General Public License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ *
+ * This Java source code belongs to XLogo4Schools, written by Marko Zivkovic
+ * during his Bachelor thesis at the computer science department of ETH Z�rich,
+ * in the year 2013 and/or during future work.
+ *
+ * It is a reengineered version of XLogo written by Lo�c Le Coq, published
+ * under the GPL License at http://xlogo.tuxfamily.org/
+ *
+ * Contents of this file were initially written by Lo�c Le Coq,
+ * modifications, extensions, refactorings migh have been applied by Marko Zivkovic
+ */
+
+package xlogo.gui.translation;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.awt.Component;
+import java.util.Vector;
+import java.util.Enumeration;
+import java.util.Collections;
+
+import javax.swing.ListSelectionModel;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.AbstractCellEditor;
+import javax.swing.table.TableCellEditor;
+import javax.swing.JTextArea;
+import javax.swing.JPanel;
+import javax.swing.JTable;
+import javax.swing.event.*;
+import javax.swing.JScrollPane;
+
+import java.awt.event.*;
+
+import xlogo.gui.Searchable;
+import xlogo.storage.workspace.Language;
+import xlogo.Logo;
+public class MyTable extends JPanel implements Searchable{
+ private static final long serialVersionUID = 1L;
+ private JTable table;
+ private JScrollPane scrollPane;
+ private TranslateXLogo tx;
+ private String id;
+ private String action;
+ private String bundle;
+ private Vector<String> keys;
+ protected MyTable(TranslateXLogo tx, String action, String id,String bundle){
+ this.tx=tx;
+ this.action=action;
+ this.id=id;
+ this.bundle=bundle;
+ initGui();
+ }
+
+ public void setColumnSize(){
+ for (int i = 0 ; i < table.getColumnCount() ; i++)
+ {
+ table.getColumnModel().getColumn(i).setPreferredWidth(200);
+ }
+ }
+ protected String getValue(int a, int b){
+ return table.getValueAt(a, b).toString();
+ }
+ private void initGui(){
+ setLayout(new java.awt.BorderLayout());
+ table=new JTable(new MyModel(bundle,action,id));
+
+ MultiLineCellEditor editor = new MultiLineCellEditor(table);
+ table.setDefaultEditor(String.class,editor);
+
+ table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+ scrollPane = new JScrollPane(table);
+ //table.setFillsViewportHeight(true);
+ // Only one selection is possible
+ table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ // You can only select Cell
+ table.setCellSelectionEnabled (true);
+ setColumnSize();
+ add(scrollPane,java.awt.BorderLayout.CENTER);
+
+ }
+ protected Vector<String> getKeys(){
+ return keys;
+ }
+ class MultiLineCellEditor extends AbstractCellEditor implements TableCellEditor {
+ private static final long serialVersionUID = 1L;
+ MyTextArea textArea;
+ JTable table;
+
+ public MultiLineCellEditor(JTable ta) {
+ super();
+ table = ta;
+ // this component relies on having this renderer for the String class
+ MultiLineCellRenderer renderer = new MultiLineCellRenderer();
+ table.setDefaultRenderer(String.class,renderer);
+// JOptionPane.showMessageDialog(null,"jui ds l'editor","h",JOptionPane.INFORMATION_MESSAGE);
+ textArea = new MyTextArea();
+ textArea.setLineWrap(true);
+ textArea.setWrapStyleWord(true);
+ for(int i=0;i<table.getRowCount();i++) updateRow(i);
+ }
+
+ /** This method determines the height in pixel of a cell given the text it contains */
+ private int cellHeight(int row,int col) {
+ if (row == table.getEditingRow() && col == table.getEditingColumn())
+ return textArea.getPreferredSize().height;
+ else
+ return table.getDefaultRenderer(String.class).getTableCellRendererComponent(table,
+ table.getModel().getValueAt(row,col),false,false,row,col).getPreferredSize().height;
+ }
+
+ void cellGrewEvent(int row,int column) {
+ updateRow(row);
+ }
+
+ void cellShrankEvent(int row,int column) {
+ updateRow(row);
+ }
+
+ void updateRow(int row) {
+ int maxHeight = 0;
+ for(int j=0;j<table.getColumnCount();j++) {
+ int ch;
+ if ((ch = cellHeight(row,j)) > maxHeight) {
+ maxHeight = ch;
+ }
+ }
+ table.setRowHeight(row,maxHeight);
+ }
+
+ public Object getCellEditorValue() {
+ return textArea.getText();
+ }
+ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
+ int row, int column) {
+ textArea.setText(table.getValueAt(row,column).toString());
+ textArea.rowEditing = row;
+ textArea.columnEditing = column;
+ textArea.lastPreferredHeight = textArea.getPreferredSize().height;
+
+ return textArea;
+
+ }
+
+ class MyTextArea extends JTextArea implements KeyListener {
+ private static final long serialVersionUID = 1L;
+ int lastPreferredHeight = 0;
+ int rowEditing;
+ int columnEditing;
+
+ MyTextArea() {
+ addKeyListener(this);
+ // This is a fix to Bug Id 4256006
+ addAncestorListener( new AncestorListener(){
+ public void ancestorAdded(AncestorEvent e){
+ requestFocus();
+ }
+ public void ancestorMoved(AncestorEvent e){}
+ public void ancestorRemoved(AncestorEvent e){}
+ });
+ }
+
+ public void keyPressed(KeyEvent e) {}
+ public void keyReleased(KeyEvent e) {}
+ public void keyTyped(KeyEvent e) {
+ if (getPreferredSize().getHeight() > lastPreferredHeight) {
+ lastPreferredHeight = getPreferredSize().height;
+ cellGrewEvent(rowEditing,columnEditing);
+ // this will trigger the addition of extra lines upon the cell growing and
+ // prevent all the text being lost when the cell grows to the point of requiring
+ // scrollbars
+ table.setValueAt(getText(),rowEditing,columnEditing);
+ }
+ else if (getPreferredSize().getHeight() < lastPreferredHeight) {
+ lastPreferredHeight = getPreferredSize().height;
+ cellShrankEvent(rowEditing,columnEditing);
+ }
+ else if (table.getValueAt(rowEditing,columnEditing).equals(""))
+ table.setValueAt(getText(),rowEditing,columnEditing);
+
+ }
+ }
+ }
+
+ class MyModel extends AbstractTableModel {
+ private static final long serialVersionUID = 1L;
+ private String[] columnNames;
+ private String[][] rowData;
+ String action;
+ String id;
+
+ MyModel(String bundle,String action, String id){
+ this.action=action;
+ this.id=id;
+
+ if (action.equals(TranslateXLogo.CREATE)){
+ // Initilaize all Column Names
+ String[] tmp=Logo.translationLanguage;
+ columnNames=new String[tmp.length+1];
+ columnNames[0]=id;
+ for (int i=1;i<columnNames.length;i++){
+ columnNames[i]=tmp[i-1];
+ }
+ }
+ else columnNames=Logo.translationLanguage;
+ buildRowData(bundle, action,id);
+ }
+ public String getColumnName(int col) {
+ return columnNames[col].toString();
+ }
+ public int getRowCount() { return rowData.length; }
+ public int getColumnCount() { return columnNames.length; }
+ public Object getValueAt(int row, int col) {
+ return rowData[row][col];
+ }
+ public boolean isCellEditable(int row, int col)
+ {
+ if (action.equals(TranslateXLogo.CONSULT)) return false;
+ else if (action.equals(TranslateXLogo.CREATE)) {
+ if (col==0) return true;
+ else return false;
+ }
+ else if (action.equals(TranslateXLogo.MODIFY)) {
+ if (col==Integer.parseInt(id)) return true;
+ else return false;
+ }
+ else if (action.equals(TranslateXLogo.COMPLETE)) {
+ if (col==Integer.parseInt(id)) {
+
+ if (rowData[row][col].equals("")) return true;
+ else return false;
+ }
+ else return false;
+ }
+ return true; }
+ public void setValueAt(Object value, int row, int col) {
+ rowData[row][col] = value.toString();
+ fireTableCellUpdated(row, col);
+ }
+ public Class<? extends Object> getColumnClass(int c) {
+ return getValueAt(0, c).getClass();
+
+ }
+
+ private void buildRowData(String bundle,String action, String id){
+ ResourceBundle[] rb=new ResourceBundle[getColumnCount()];
+ // initialize all ResourceBundle
+ for(int i=0;i<getColumnCount();i++){
+ Locale locale = Language.getLanguage(i).getLocale();
+ // In CREATE Mode, when i=getColumnCount(), the last locale is null
+ if (null==locale) break;
+ rb[i] = ResourceBundle.getBundle(bundle, locale);
+ }
+ keys=new Vector<String>();
+ Enumeration<String> en=rb[0].getKeys();
+ while(en.hasMoreElements()){
+ String value=en.nextElement();
+ keys.add(value);
+ }
+ Collections.sort(keys);
+ rowData=new String[keys.size()][getColumnCount()];
+ int row=0;
+ for (int j=0;j<keys.size();j++) {
+ String key=keys.get(j).toString();
+
+ for(int i=0;i<getColumnCount();i++){
+ if (action.equals(TranslateXLogo.CREATE)){
+ if (i==0) rowData[row][0]="";
+ else rowData[row][i]=rb[i-1].getString(key);
+ }
+ else {
+ String element=rb[i].getString(key);
+ if (element.equals("")) {
+ rowData[row][i]="";
+ }
+ else rowData[row][i]=element;
+ }
+ }
+ row++;
+ }
+ }
+ }
+ class MultiLineCellRenderer extends JTextArea implements TableCellRenderer {
+ private static final long serialVersionUID = 1L;
+ public MultiLineCellRenderer() {
+ setEditable(false);
+ setLineWrap(true);
+ setWrapStyleWord(true);
+ }
+
+ public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected, boolean hasFocus, int row, int column) {
+
+ if (value instanceof String) {
+ if (value.toString().equals("")) setBackground(new java.awt.Color(255,200,200));
+ else setBackground(java.awt.Color.WHITE);
+ setText((String)value);
+ if (isSelected) setBackground(java.awt.Color.LIGHT_GRAY);
+ // set the table's row height, if necessary
+ //updateRowHeight(row,getPreferredSize().height);
+ }
+ else
+ setText("");
+ return this;
+ }
+ }
+ int selectedRow=0;
+ int selectedColumn=0;
+ public boolean find(String element,boolean forward){
+ int row=table.getSelectedRow();
+ int col=table.getSelectedColumn();
+ if (row!=-1) {
+ if (row==table.getRowCount()-1) {
+ selectedRow=0;
+ if (col==table.getColumnCount()-1) selectedColumn=0;
+ else selectedColumn=col+1;
+ }
+ else selectedRow=row+1;
+ }
+ int start=selectedRow;
+ for (int c=selectedColumn;c<table.getColumnCount();c++){
+ for(int r=start;r<table.getRowCount();r++){
+ String value=table.getValueAt(r, c).toString();
+ int index=value.indexOf(element);
+ if (index!=-1) {
+ table.clearSelection();
+ if (r==table.getRowCount()-1){
+ selectedRow=0;
+ if (c==table.getColumnCount()-1) selectedColumn=0;
+ else selectedColumn=c+1;
+ }
+ else {
+ selectedRow=r+1;
+ selectedColumn=c;
+ }
+ boolean b=table.editCellAt(r, c);
+ if (!b) {
+ table.changeSelection(r, c,false,false);
+ }
+// System.out.println(selectedRow+" "+selectedColumn);
+ return true;
+ }
+ }
+ start=0;
+ }
+ selectedColumn=0;
+ selectedRow=0;
+ table.changeSelection(0, 0,false,false);
+ return false;
+ }
+ public void replace(String element, boolean forward){
+
+ }
+ public void replaceAll(String element, String substitute){
+
+ }
+ public void removeHighlight(){
+ tx.resetSearchFrame();
+ }
+
+}