/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
******************************************************************************/
package com.opendoorlogistics.studio.tables.schema;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import com.opendoorlogistics.api.tables.ODLDatastoreUndoable;
import com.opendoorlogistics.api.tables.ODLListener;
import com.opendoorlogistics.api.tables.ODLTableDefinitionAlterable;
import com.opendoorlogistics.api.ui.Disposable;
import com.opendoorlogistics.components.tables.creator.TableDefinitionGrid;
import com.opendoorlogistics.core.scripts.execution.ExecutionReportImpl;
import com.opendoorlogistics.core.utils.ui.ExecutionReportDialog;
import com.opendoorlogistics.studio.internalframes.ODLInternalFrame;
final public class TableSchemaEditor extends ODLInternalFrame implements Disposable, ODLListener{
final private ODLDatastoreUndoable<? extends ODLTableDefinitionAlterable> ds;
final private int tableId;
final private MyGrid grid;
public TableSchemaEditor(ODLDatastoreUndoable<? extends ODLTableDefinitionAlterable> ds,int tableId) {
super("SchemaEditor" + tableId);
this.ds = ds;
this.tableId = tableId;
this.grid = new MyGrid(ds.getTableByImmutableId(tableId));
ds.addListener(this);
setLayout(new BorderLayout());
add(grid, BorderLayout.CENTER);
updateAppearance();
}
private class MyGrid extends TableDefinitionGrid{
MyGrid(ODLTableDefinitionAlterable dfn) {
super(dfn, false);
}
@Override
protected void modify(Runnable runnable){
final ExecutionReportImpl report = new ExecutionReportImpl();
try {
ds.startTransaction();
super.modify(runnable);
} catch (Throwable e) {
report.setFailed(e);
report.setFailed("Failed to modify the table schema.");
}finally{
if(ds.isInTransaction()){
if(report.isFailed()){
ds.rollbackTransaction();
}else{
ds.endTransaction();
}
}
if(report.isFailed()){
ExecutionReportDialog.show((JFrame) SwingUtilities.getWindowAncestor(this), "Error modifying schema", report);
}
}
}
}
@Override
public void dispose() {
ds.removeListener(this);
super.dispose();
}
@Override
public void tableChanged(int tableId, int firstRow, int lastRow) {
// only data change; don't need to do anything
}
@Override
public void datastoreStructureChanged() {
ODLTableDefinitionAlterable dfn = getTable();
if(dfn==null){
// table no longer exists
dispose();
}else{
// update grid
grid.setTable(dfn);
updateAppearance();
}
}
private ODLTableDefinitionAlterable getTable() {
ODLTableDefinitionAlterable dfn = ds.getTableByImmutableId(tableId);
return dfn;
}
@Override
public ODLListenerType getType() {
return ODLListenerType.DATASTORE_STRUCTURE_CHANGED;
}
private void updateAppearance(){
ODLTableDefinitionAlterable dfn = getTable();
String title = "Edit table schema";
if(dfn!=null){
title += " - " + dfn.getName();
}
setTitle(title);
}
public int getTableId(){
return tableId;
}
}