package com.applang.components;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.sql.Connection;
import java.sql.Statement;
import javax.swing.AbstractButton;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import com.applang.PluginUtils;
import com.applang.berichtsheft.BerichtsheftApp;
import com.applang.berichtsheft.plugin.BerichtsheftPlugin;
import static com.applang.Util.*;
import static com.applang.Util2.*;
import static com.applang.SwingUtil.*;
import static com.applang.PluginUtils.*;
public class ActionPanel extends ManagerBase<Object>
{
protected static final String TAG = ActionPanel.class.getSimpleName();
public static void createAndShowGUI(String title,
final Dimension preferred,
int modality,
final ActionPanel actionPanel,
final Function<Component> centerComponent,
final Object... params)
{
showFrame(null, title,
new UIFunction() {
public Component[] apply(Component comp, Object[] parms) {
Container contentPane = new JPanel(new BorderLayout());
actionPanel.memberOf(northToolBar(contentPane));
contentPane.add(centerComponent.apply(params), BorderLayout.CENTER);
southStatusBar(contentPane);
if (preferred != null)
contentPane.setPreferredSize(preferred);
return components(contentPane);
}
},
new UIFunction() {
public Component[] apply(Component comp, Object[] parms) {
printContainer("createAndShowGUI", (Container)comp, true);
actionPanel.start();
return null;
}
},
new UIFunction() {
public Component[] apply(Component comp, Object[] parms) {
actionPanel.finish();
return null;
}
},
modality);
}
protected void start(Object... params) {
BerichtsheftApp.loadSettings();
}
public void finish(Object... params) {
Settings.save();
}
public enum ActionType implements CustomActionType
{
CALENDAR (0, "manager.action-CALENDAR"),
PREVIOUS (1, "manager.action-PREVIOUS"),
NEXT (2, "manager.action-NEXT"),
DATABASE (3, "manager.action-DATABASE"),
INSERT (4, "manager.action-INSERT"),
FIRST (5, "manager.action-FIRST"),
UPDATE (6, "manager.action-UPDATE"),
LAST (7, "manager.action-LAST"),
DELETE (8, "manager.action-DELETE"),
PICK (9, "manager.action-PICK"),
DATE (10, "manager.action-DATE"),
TITLE (11, "manager.action-TITLE"),
IMPORT (12, "manager.action-IMPORT"),
TEXT (13, "manager.action-TEXT"),
TOGGLE1 (14, "manager.action-TOGGLE1"),
TOGGLE2 (15, "manager.action-TOGGLE2"),
STRUCT (16, "manager.action-STRUCT"),
ANDROID (17, "manager.action-ANDROID"),
ACTIONS (18, "Actions"); // needs to stay last !
private final int index;
private final String resourceName;
ActionType(int index, String resourceName) {
this.index = index;
this.resourceName = resourceName;
}
@Override
public int index() { return index; }
@Override
public String resourceName() { return resourceName; }
@Override
public String iconName() {
return getProperty(resourceName + ".icon");
}
@Override
public String description() {
return getProperty(resourceName.concat(".label"));
}
@Override
public String name(int state) {
return getProperty(resourceName.concat(".label") + "." + state);
}
}
private Container view;
public Container getView() {
return view;
}
protected String dbFilePath;
protected String caption;
public ActionPanel(IComponent iComponent, Object... params) {
this.iComponent = iComponent;
if (iComponent instanceof ITextComponent) {
setupTextArea((ITextComponent) iComponent);
}
view = param(null, 0, params);
caption = param_String("Database", 1, params);
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
bars = param_Integer(1, 2, params);
buttons = new AbstractButton[bars * (1 + ActionType.ACTIONS.index())];
}
public void memberOf(Container container, Object...params) {
Object param0 = param(null, 0, params);
if (param0 instanceof String)
for (int i = 0; i < buttons.length; i++) {
AbstractButton btn = buttons[i];
if (btn != null) {
Object actionName = btn.getAction().getValue(CustomAction.NAME);
if (asList(params).indexOf(actionName) > -1)
container.add(btn);
}
}
else
container.add(this, param0);
}
protected AbstractButton[] buttons;
private int bars;
private int index(int i, int...bar) {
return i += param(0, 0, bar) * buttons.length / bars;
}
private void _add(Container container, int index, AbstractButton btn, int...bar) {
index = index(index, bar);
if (index > -1 && index < buttons.length) {
int pos = param(container.getComponentCount(), 1, bar);
container.add(buttons[index] = btn, pos);
}
}
public void addButton(Container container, int index, CustomAction customAction, int...bar) {
_add(container, index, makeCustomButton(customAction, false), bar);
}
public void addToggle(Container container, int index, CustomAction customAction, int...bar) {
_add(container, index, new JToggleButton(customAction), bar);
}
public void removeButton(Container container, int index, int...bar) {
index = index(index, bar);
if (index > -1 && index < buttons.length)
if (buttons[index] != null) {
container.remove(buttons[index]);
buttons[index] = null;
}
}
public CustomAction getAction(int index, int...bar) {
index = index(index, bar);
if (index > -1 && index < buttons.length)
return (CustomAction) buttons[index].getAction();
else
return null;
}
public void setAction(int index, CustomAction customAction, int...bar) {
index = index(index, bar);
if (index > -1 && index < buttons.length)
buttons[index].setAction(customAction);
}
public void clickAction(int index, int...bar) {
index = index(index, bar);
if (index > -1 && index < buttons.length)
buttons[index].doClick();
}
public void enableAction(int index, boolean enabled, int...bar) {
if (buttons[index] != null)
buttons[index].getAction().setEnabled(enabled);
}
public boolean isActionEnabled(int index, int...bar) {
return buttons[index].getAction().isEnabled();
}
protected IComponent iComponent = null;
protected boolean hasTextComponent() {
return iComponent instanceof ITextComponent;
}
public TextToggle getTextToggle() {
return hasTextComponent() ? (TextToggle) iComponent : null;
}
protected void setupTextArea(ITextComponent iTextComponent) {
if (hasTextComponent()) {
getTextToggle().addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
setDirty(true);
}
});
}
}
public void setText(String text) {
if (hasTextComponent())
getTextToggle().setText(text);
}
public String getText() {
return hasTextComponent() ?
getTextToggle().getText() :
null;
}
protected String chooseDatabase(String dbName) {
if (memoryDb)
handleMemoryDb(false);
if (dbName != null) {
File file = chooseFile(true, this, caption, new File(dbName));
if (file != null)
dbName = file.getPath();
}
return dbName;
}
DataBaseConnect dbConnect = new DataBaseConnect() {
@Override
public void preConnect(String path) throws Exception {
beforeConnecting(path);
}
@Override
public void postConnect() throws Exception {
afterConnecting();
}
};
public Statement getStmt() {
return dbConnect.getStmt();
}
public String getScheme() {
return dbConnect.getScheme();
}
public Connection getCon() {
return dbConnect.getCon();
}
public boolean openConnection(String dbPath, Object... params) throws Exception {
return dbConnect.open(dbPath, params);
}
public void closeConnection() {
dbConnect.close();
}
protected void beforeConnecting(String path) throws Exception {
if (path.endsWith("*"))
throw new Exception(String.format("'%s' is not a legal database name", path));
}
protected void afterConnecting() throws Exception {
if (memoryDb && fileExists(memoryDbName))
getStmt().executeUpdate("restore from " + memoryDbName);
}
protected boolean memoryDb = false;
private String memoryDbName = "";
private void handleMemoryDb(boolean restore) {
try {
if (restore) {
memoryDbName = tempPath(BerichtsheftPlugin.NAME, "memory.db");
openConnection(memoryDbName);
}
else if ("sqlite".equals(getScheme()) && memoryDbName.length() > 0) {
getStmt().executeUpdate("backup to " + memoryDbName);
memoryDbName = "";
}
} catch (Exception e) {
handleException(e);
}
}
protected void updateOnRequest() {
}
}