[DEV] nearly fisnish to develop fileChooser
This commit is contained in:
parent
f02987f8bf
commit
2e0a24f1c3
@ -1,197 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <ewol/widget/meta/FileChooser.hpp>
|
|
||||||
#include <ewol/widget/Sizer.hpp>
|
|
||||||
#include <ewol/widget/List.hpp>
|
|
||||||
#include <ewol/widget/Button.hpp>
|
|
||||||
#include <ewol/widget/CheckBox.hpp>
|
|
||||||
#include <ewol/widget/ListFileSystem.hpp>
|
|
||||||
#include <ewol/widget/Entry.hpp>
|
|
||||||
#include <ewol/widget/Spacer.hpp>
|
|
||||||
#include <ewol/widget/Image.hpp>
|
|
||||||
#include <ewol/widget/Composer.hpp>
|
|
||||||
#include <ewol/widget/Manager.hpp>
|
|
||||||
//#include <etk/Vector.hpp>
|
|
||||||
#include <etk/Vector.hpp>
|
|
||||||
#include <etk/tool.hpp>
|
|
||||||
#include <etk/path/fileSystem.hpp>
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
// file browsing ...
|
|
||||||
#include <dirent.h>
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <ewol/ewol.hpp>
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::FileChooser);
|
|
||||||
|
|
||||||
ewol::widget::FileChooser::FileChooser() :
|
|
||||||
signalCancel(this, "cancel", ""),
|
|
||||||
signalValidate(this, "validate", ""),
|
|
||||||
propertyPath(this, "path",
|
|
||||||
etk::path::getHomePath(),
|
|
||||||
"",
|
|
||||||
ewol::widget::FileChooser::onChangePropertyPath),
|
|
||||||
propertyFile(this, "file",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
ewol::widget::FileChooser::onChangePropertyFile),
|
|
||||||
propertyLabelTitle(this, "title",
|
|
||||||
"_T{FileChooser}",
|
|
||||||
"",
|
|
||||||
ewol::widget::FileChooser::onChangePropertyLabelTitle),
|
|
||||||
propertyLabelValidate(this, "label-validate",
|
|
||||||
"_T{Validate}",
|
|
||||||
"",
|
|
||||||
ewol::widget::FileChooser::onChangePropertyLabelValidate),
|
|
||||||
propertyLabelCancel(this, "label-cancel",
|
|
||||||
"_T{Cancel}",
|
|
||||||
"",
|
|
||||||
ewol::widget::FileChooser::onChangePropertyLabelCancel) {
|
|
||||||
addObjectType("ewol::widget::FileChooser");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::init() {
|
|
||||||
ewol::widget::Composer::init();
|
|
||||||
// Load file with replacing the "{ID}" with the local ID of the widget ==> obtain unique ID
|
|
||||||
loadFromFile("DATA:///ewol-gui-file-chooser.xml?lib=ewol", getId());
|
|
||||||
// Basic replacement of labels
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:title-label", "value", propertyLabelTitle);
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:validate-label", "value", propertyLabelValidate);
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:cancel-label", "value", propertyLabelCancel);
|
|
||||||
|
|
||||||
subBind(ewol::widget::CheckBox, "[" + etk::toString(getId()) + "]file-shooser:show-hiden-file", signalValue, sharedFromThis(), ewol::widget::FileChooser::onCallbackHidenFileChangeChangeValue);
|
|
||||||
subBind(ewol::widget::Button, "[" + etk::toString(getId()) + "]file-shooser:button-validate", signalPressed, sharedFromThis(), ewol::widget::FileChooser::onCallbackListValidate);
|
|
||||||
subBind(ewol::widget::Button, "[" + etk::toString(getId()) + "]file-shooser:button-cancel", signalPressed, sharedFromThis(), ewol::widget::FileChooser::onCallbackButtonCancelPressed);
|
|
||||||
subBind(ewol::widget::ListFileSystem, "[" + etk::toString(getId()) + "]file-shooser:list-folder", signalFolderValidate, sharedFromThis(), ewol::widget::FileChooser::onCallbackListFolderSelectChange);
|
|
||||||
subBind(ewol::widget::ListFileSystem, "[" + etk::toString(getId()) + "]file-shooser:list-files", signalFileSelect, sharedFromThis(), ewol::widget::FileChooser::onCallbackListFileSelectChange);
|
|
||||||
subBind(ewol::widget::ListFileSystem, "[" + etk::toString(getId()) + "]file-shooser:list-files", signalFileValidate, sharedFromThis(), ewol::widget::FileChooser::onCallbackListFileValidate);
|
|
||||||
subBind(ewol::widget::Entry, "[" + etk::toString(getId()) + "]file-shooser:entry-file", signalModify, sharedFromThis(), ewol::widget::FileChooser::onCallbackEntryFileChangeValue);
|
|
||||||
subBind(ewol::widget::Entry, "[" + etk::toString(getId()) + "]file-shooser:entry-file", signalEnter, sharedFromThis(), ewol::widget::FileChooser::onCallbackEntryFileChangeValidate);
|
|
||||||
subBind(ewol::widget::Entry, "[" + etk::toString(getId()) + "]file-shooser:entry-folder", signalModify, sharedFromThis(), ewol::widget::FileChooser::onCallbackEntryFolderChangeValue);
|
|
||||||
//composerBind(ewol::widget::CheckBox, "[" + etk::toString(getId()) + "]file-shooser:entry-folder", signalEnter, sharedFromThis(), ewol::widget::FileChooser::);
|
|
||||||
subBind(ewol::widget::Image, "[" + etk::toString(getId()) + "]file-shooser:img-home", signalPressed, sharedFromThis(), ewol::widget::FileChooser::onCallbackHomePressed);
|
|
||||||
// set the default Folder properties:
|
|
||||||
updateCurrentFolder();
|
|
||||||
propertyCanFocus.set(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onGetFocus() {
|
|
||||||
// transfert focus on a specific widget...
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:entry-file", "focus", "true");
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::FileChooser::~FileChooser() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onChangePropertyPath() {
|
|
||||||
propertyPath.getDirect() = *propertyPath + "/";
|
|
||||||
updateCurrentFolder();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onChangePropertyFile() {
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:entry-file", "value", propertyFile.getFileName());
|
|
||||||
//updateCurrentFolder();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onChangePropertyLabelTitle() {
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:title-label", "value", propertyLabelTitle);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onChangePropertyLabelValidate() {
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:validate-label", "value", propertyLabelValidate);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onChangePropertyLabelCancel() {
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:cancel-label", "value", propertyLabelCancel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackEntryFolderChangeValue( String _value) {
|
|
||||||
// == > change the folder name
|
|
||||||
// TODO : change the folder, if it exit ...
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackEntryFileChangeValue( String _value) {
|
|
||||||
// == > change the file name.get(.get(
|
|
||||||
propertyFile.setDirect(_value);
|
|
||||||
// update the selected file in the list :
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:list-files", "select", propertyFile.getString());
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackButtonCancelPressed() {
|
|
||||||
// == > Auto remove ...
|
|
||||||
signalCancel.emit();
|
|
||||||
autoDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackHidenFileChangeChangeValue( bool _value) {
|
|
||||||
if (_value == true) {
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:list-folder", "show-hidden", "true");
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:list-files", "show-hidden", "true");
|
|
||||||
} else {
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:list-folder", "show-hidden", "false");
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:list-files", "show-hidden", "false");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackListFolderSelectChange( etk::Path _value) {
|
|
||||||
// == > this is an internal event ...
|
|
||||||
Log.debug(" old PATH: '" + *propertyPath + "' ==> '" + _value + "'");
|
|
||||||
propertyPath.setDirect(_value);
|
|
||||||
Log.debug("new PATH: '" + *propertyPath + "'");
|
|
||||||
propertyFile.setDirect("");
|
|
||||||
updateCurrentFolder();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackListFileSelectChange( etk::Path _value) {
|
|
||||||
propertyFile.set(_value);
|
|
||||||
/*
|
|
||||||
String tmpFileCompleatName = this.folder;
|
|
||||||
tmpFileCompleatName += this.file;
|
|
||||||
// TODO : generateEventId(_msg.getMessage(), tmpFileCompleatName);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackListFileValidate( etk::Path _value) {
|
|
||||||
// select the file == > generate a validate
|
|
||||||
propertyFile.set(_value);
|
|
||||||
Log.verbose(" generate a fiel opening : '" + propertyFile + "'");
|
|
||||||
signalValidate.emit(_value);
|
|
||||||
autoDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackEntryFileChangeValidate( String _value) {
|
|
||||||
onCallbackListFileValidate(_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackListValidate() {
|
|
||||||
if (propertyFile.get() == "") {
|
|
||||||
Log.warning(" Validate : '" + *propertyFile + "' ==> error No name ...");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Log.debug(" generate a file opening : '" + *propertyFile + "'");
|
|
||||||
signalValidate.emit(*propertyFile);
|
|
||||||
autoDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::onCallbackHomePressed() {
|
|
||||||
etk::Path tmpUserFolder = etk::path::getHomePath();
|
|
||||||
Log.debug("new PATH: '" + tmpUserFolder + "'");
|
|
||||||
|
|
||||||
propertyPath.setDirect(tmpUserFolder);
|
|
||||||
propertyFile.setDirect("");
|
|
||||||
updateCurrentFolder();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::FileChooser::updateCurrentFolder() {
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:list-files", "path", propertyPath.getString());
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:list-folder", "path", propertyPath.getString());
|
|
||||||
propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]file-shooser:entry-folder", "value", propertyPath.getString());
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
@ -1,106 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
|
||||||
#include <ewol/debug.hpp>
|
|
||||||
#include <ewol/widget/Composer.hpp>
|
|
||||||
#include <esignal/Signal.hpp>
|
|
||||||
|
|
||||||
namespace ewol {
|
|
||||||
namespace widget {
|
|
||||||
class FileChooser;
|
|
||||||
using FileChooser = ememory::Ptr<ewol::widget::FileChooser>;
|
|
||||||
using FileChooserWeak = ememory::WeakPtr<ewol::widget::FileChooser>;
|
|
||||||
/**
|
|
||||||
* File Chooser is a simple selector of file for opening, saving, and what you want ...
|
|
||||||
*
|
|
||||||
* As all other pop-up methode ( wost case we can have) the creating is simple , but event back is not all the time simple:
|
|
||||||
*
|
|
||||||
* Fist global static declaration and inclusion:
|
|
||||||
* [code style=c++]
|
|
||||||
* #include <ewol/widget/meta/FileChooser.hpp>
|
|
||||||
* [/code]
|
|
||||||
*
|
|
||||||
* The first step is to create the file chooser pop-up : (never in the ructor!!!)
|
|
||||||
* [code style=c++]
|
|
||||||
* ewol::widget::FileChooser tmpWidget = ewol::widget::FileChooser::create();
|
|
||||||
* if (tmpWidget == null) {
|
|
||||||
* APPL_ERROR("Can not open File chooser !!! ");
|
|
||||||
* return -1;
|
|
||||||
* }
|
|
||||||
* // register on the Validate event:
|
|
||||||
* tmpWidget.signalValidate.connect(sharedFromThis(), ****::onCallbackOpenFile);
|
|
||||||
* // no need of this event watching ...
|
|
||||||
* tmpWidget.signalCancel.connect(sharedFromThis(), ****::onCallbackClosePopUp);
|
|
||||||
* // set the title:
|
|
||||||
* tmpWidget.propertyLabelTitle.set("Open files ...");
|
|
||||||
* // Set the validate Label:
|
|
||||||
* tmpWidget.propertyLabelValidate.set("Open");
|
|
||||||
* // simply set a folder (by default this is the home folder)
|
|
||||||
* //tmpWidget.propertyPath.set("/home/me");
|
|
||||||
* // add the widget as windows pop-up ...
|
|
||||||
* ewol::widget::Windows tmpWindows = getWindows();
|
|
||||||
* if (tmpWindows == null) {
|
|
||||||
* APPL_ERROR("Can not get the current windows !!! ");
|
|
||||||
* return -1;
|
|
||||||
* }
|
|
||||||
* tmpWindows.popUpWidgetPush(tmpWidget);
|
|
||||||
* [/code]
|
|
||||||
*
|
|
||||||
* Now we just need to wait the the open event message.
|
|
||||||
*
|
|
||||||
* [code style=c++]
|
|
||||||
* void ****::onCallbackOpenFile( String _value) {
|
|
||||||
* APPL_INFO("Request open file : '" + _value + "'");
|
|
||||||
* }
|
|
||||||
* void ****::onCallbackClosePopUp() {
|
|
||||||
* APPL_INFO("The File chooser has been closed");
|
|
||||||
* }
|
|
||||||
* [/code]
|
|
||||||
* This is the best example of a Meta-widget.
|
|
||||||
*/
|
|
||||||
class FileChooser : public ewol::widget::Composer {
|
|
||||||
public: // signals
|
|
||||||
esignal::Signal<> signalCancel; //!< abort the display of the pop-up or press cancel button
|
|
||||||
esignal::Signal<etk::Path> signalValidate; //!< select file(s)
|
|
||||||
public: // properties
|
|
||||||
eproperty::Value<etk::Path> propertyPath; //!< Current path to explore
|
|
||||||
eproperty::Value<etk::Path> propertyFile; //!< Selected file
|
|
||||||
eproperty::Value<String> propertyLabelTitle; //!< Label of the pop-up (can use translation)
|
|
||||||
eproperty::Value<String> propertyLabelValidate; //!< Label of validate button of the pop-up (can use translation)
|
|
||||||
eproperty::Value<String> propertyLabelCancel; //!< Label of cancel/close button of the pop-up (can use translation)
|
|
||||||
protected:
|
|
||||||
FileChooser();
|
|
||||||
void init() ;
|
|
||||||
public:
|
|
||||||
DECLARE_WIDGET_FACTORY(FileChooser, "FileChooser");
|
|
||||||
~FileChooser();
|
|
||||||
private:
|
|
||||||
void updateCurrentFolder();
|
|
||||||
public:
|
|
||||||
void onGetFocus() ;
|
|
||||||
private:
|
|
||||||
// callback functions:
|
|
||||||
void onCallbackEntryFolderChangeValue( String _value);
|
|
||||||
void onCallbackEntryFileChangeValue( String _value);
|
|
||||||
void onCallbackEntryFileChangeValidate( String _value);
|
|
||||||
void onCallbackButtonCancelPressed();
|
|
||||||
void onCallbackHidenFileChangeChangeValue( bool _value);
|
|
||||||
void onCallbackListFolderSelectChange( etk::Path _value);
|
|
||||||
void onCallbackListFileSelectChange( etk::Path _value);
|
|
||||||
void onCallbackListFileValidate( etk::Path _value);
|
|
||||||
void onCallbackListValidate();
|
|
||||||
void onCallbackHomePressed();
|
|
||||||
protected:
|
|
||||||
void onChangePropertyPath();
|
|
||||||
void onChangePropertyFile();
|
|
||||||
void onChangePropertyLabelTitle();
|
|
||||||
void onChangePropertyLabelValidate();
|
|
||||||
void onChangePropertyLabelCancel();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
@ -11,15 +11,13 @@ public class MainWindows extends BasicWindows {
|
|||||||
public MainWindows() {
|
public MainWindows() {
|
||||||
setPropertyTitle("Simple Button test");
|
setPropertyTitle("Simple Button test");
|
||||||
//final Widget data = Composer.composerGenerateString("<Composer><Label>hello, how are you</Label></Composer>");
|
//final Widget data = Composer.composerGenerateString("<Composer><Label>hello, how are you</Label></Composer>");
|
||||||
//final Widget data = Composer.composerGenerateString("<Composer><Button><Label gravity=\"center\">hello, how are you</Label></Button></Composer>");
|
final Widget data = Composer.composerGenerateString("<FileChooser/>");
|
||||||
/*
|
/*
|
||||||
final Widget data = Composer.composerGenerateString("<Button toggle='true' fill='true,false,false' expand='true'>" + "<Label>hello, how are you</Label>"
|
final Widget data = Composer.composerGenerateString("<Button toggle='true' fill='true,false,false' expand='true'>" + "<Label>hello, how are you</Label>"
|
||||||
+ "<Label>You <br/>Click - Me <b>!?<!--kjlkjlkjlkj-->d</b></Label>" + "</Button>");
|
+ "<Label>You <br/>Click - Me <b>!?<!--kjlkjlkjlkj-->d</b></Label>" + "</Button>");
|
||||||
*/
|
*/
|
||||||
|
//final Widget data = Composer.composerGenerateFile(new Uri("DATA", "ewol-gui-file-chooser.xml", "ewol"));
|
||||||
final Widget data = Composer.composerGenerateFile(new Uri("DATA", "ewol-gui-file-chooser.xml", "ewol"));
|
|
||||||
this.setTestWidget(data);
|
this.setTestWidget(data);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
final Button simpleButton = Button
|
final Button simpleButton = Button
|
||||||
.createLabelButton("1 - My <font color=\"red\">button <i>internal</i></font> <br/>2 - <b>label</b><br/>3 - an other text ...<br/>4 - and an other line to be sure ...");
|
.createLabelButton("1 - My <font color=\"red\">button <i>internal</i></font> <br/>2 - <b>label</b><br/>3 - an other text ...<br/>4 - and an other line to be sure ...");
|
||||||
|
@ -32,7 +32,7 @@ public class EwolObject {
|
|||||||
private static Integer valUID = 0; //!< Static used for the unique ID definition
|
private static Integer valUID = 0; //!< Static used for the unique ID definition
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the curent the system inteface.
|
* get the current the system interface.
|
||||||
* @return current reference on the instance.
|
* @return current reference on the instance.
|
||||||
*/
|
*/
|
||||||
protected static EwolContext getContext() {
|
protected static EwolContext getContext() {
|
||||||
@ -60,8 +60,6 @@ public class EwolObject {
|
|||||||
|
|
||||||
private boolean isResource = false; //!< enable this when you want to declare this element is auto-remove
|
private boolean isResource = false; //!< enable this when you want to declare this element is auto-remove
|
||||||
|
|
||||||
//@EwolPropertyDescription("Object name, might be a unique reference in all the program")
|
|
||||||
//@JacksonXmlProperty(isAttribute = true, localName = "name")
|
|
||||||
protected String name = ""; //!< name of the element ...
|
protected String name = ""; //!< name of the element ...
|
||||||
|
|
||||||
protected WeakReference<EwolObject> parent = null; //!< Reference on the current parent.
|
protected WeakReference<EwolObject> parent = null; //!< Reference on the current parent.
|
||||||
|
@ -3,6 +3,7 @@ package org.atriasoft.ewol.widget;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.atriasoft.ewol.widget.meta.FileChooser;
|
||||||
import org.atriasoft.exml.annotation.XmlFactory.InterfaceXmlFactoryAccess;
|
import org.atriasoft.exml.annotation.XmlFactory.InterfaceXmlFactoryAccess;
|
||||||
|
|
||||||
public class WidgetXmlFactory implements InterfaceXmlFactoryAccess {
|
public class WidgetXmlFactory implements InterfaceXmlFactoryAccess {
|
||||||
@ -18,6 +19,7 @@ public class WidgetXmlFactory implements InterfaceXmlFactoryAccess {
|
|||||||
listWidgetAvaillable.put("CheckBox", CheckBox.class);
|
listWidgetAvaillable.put("CheckBox", CheckBox.class);
|
||||||
listWidgetAvaillable.put("ListFileSystem", ListFileSystem.class);
|
listWidgetAvaillable.put("ListFileSystem", ListFileSystem.class);
|
||||||
listWidgetAvaillable.put("PopUp", PopUp.class);
|
listWidgetAvaillable.put("PopUp", PopUp.class);
|
||||||
|
listWidgetAvaillable.put("FileChooser", FileChooser.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
345
src/org/atriasoft/ewol/widget/meta/FileChooser.java
Normal file
345
src/org/atriasoft/ewol/widget/meta/FileChooser.java
Normal file
@ -0,0 +1,345 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
|
* @license MPL v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
package org.atriasoft.ewol.widget.meta;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.atriasoft.esignal.Signal;
|
||||||
|
import org.atriasoft.esignal.SignalEmpty;
|
||||||
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolSignal;
|
||||||
|
import org.atriasoft.ewol.internal.Log;
|
||||||
|
import org.atriasoft.ewol.widget.Button;
|
||||||
|
import org.atriasoft.ewol.widget.CheckBox;
|
||||||
|
import org.atriasoft.ewol.widget.Composer;
|
||||||
|
import org.atriasoft.ewol.widget.Entry;
|
||||||
|
import org.atriasoft.ewol.widget.ImageDisplay;
|
||||||
|
import org.atriasoft.ewol.widget.Label;
|
||||||
|
import org.atriasoft.ewol.widget.ListFileSystem;
|
||||||
|
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||||
|
import org.atriasoft.exml.annotation.XmlManaged;
|
||||||
|
import org.atriasoft.exml.annotation.XmlName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* File Chooser is a simple selector of file for opening, saving, and what you want ...
|
||||||
|
*
|
||||||
|
* As all other pop-up methode ( wost case we can have) the creating is simple , but event back is not all the time simple:
|
||||||
|
*
|
||||||
|
* Fist global static declaration and inclusion:
|
||||||
|
* [code style=c++]
|
||||||
|
* package org.atriasoft.ewol.widget.meta.FileChooser;
|
||||||
|
* [/code]
|
||||||
|
*
|
||||||
|
* The first step is to create the file chooser pop-up : (never in the ructor!!!)
|
||||||
|
* [code style=c++]
|
||||||
|
* ewol::widget::FileChooser tmpWidget = ewol::widget::FileChooser::create();
|
||||||
|
* if (tmpWidget == null) {
|
||||||
|
* APPL_ERROR("Can not open File chooser !!! ");
|
||||||
|
* return -1;
|
||||||
|
* }
|
||||||
|
* // register on the Validate event:
|
||||||
|
* tmpWidget.signalValidate.connect(sharedFromThis(), ****::onCallbackOpenFile);
|
||||||
|
* // no need of this event watching ...
|
||||||
|
* tmpWidget.signalCancel.connect(sharedFromThis(), ****::onCallbackClosePopUp);
|
||||||
|
* // set the title:
|
||||||
|
* tmpWidget.propertyLabelTitle.set("Open files ...");
|
||||||
|
* // Set the validate Label:
|
||||||
|
* tmpWidget.propertyLabelValidate.set("Open");
|
||||||
|
* // simply set a folder (by default this is the home folder)
|
||||||
|
* //tmpWidget.propertyPath.set("/home/me");
|
||||||
|
* // add the widget as windows pop-up ...
|
||||||
|
* ewol::widget::Windows tmpWindows = getWindows();
|
||||||
|
* if (tmpWindows == null) {
|
||||||
|
* APPL_ERROR("Can not get the current windows !!! ");
|
||||||
|
* return -1;
|
||||||
|
* }
|
||||||
|
* tmpWindows.popUpWidgetPush(tmpWidget);
|
||||||
|
* [/code]
|
||||||
|
*
|
||||||
|
* Now we just need to wait the the open event message.
|
||||||
|
*
|
||||||
|
* [code style=c++]
|
||||||
|
* void ****::onCallbackOpenFile( String _value) {
|
||||||
|
* APPL_INFO("Request open file : '" + _value + "'");
|
||||||
|
* }
|
||||||
|
* void ****::onCallbackClosePopUp() {
|
||||||
|
* APPL_INFO("The File chooser has been closed");
|
||||||
|
* }
|
||||||
|
* [/code]
|
||||||
|
* This is the best example of a Meta-widget.
|
||||||
|
*/
|
||||||
|
public class FileChooser extends Composer {
|
||||||
|
|
||||||
|
static void onCallbackButtonCancelPressed(final FileChooser self, final Boolean value) {
|
||||||
|
if (!value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// == > Auto remove ...
|
||||||
|
self.signalCancel.emit();
|
||||||
|
self.autoDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackEntryFileChangeValidate(final FileChooser self, final String value) {
|
||||||
|
onCallbackListFileValidate(self, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackEntryFileChangeValue(final FileChooser self, final String value) {
|
||||||
|
// == > change the file name.get(.get(
|
||||||
|
self.propertyFile = value;
|
||||||
|
// update the selected file in the list :
|
||||||
|
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-shooser:list-files") instanceof final ListFileSystem tmp) {
|
||||||
|
tmp.setPropertyFile(new File(self.propertyFile));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackEntryFolderChangeValue(final FileChooser self, final String value) {
|
||||||
|
// == > change the folder name
|
||||||
|
// TODO : change the folder, if it exit ...
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackHidenFileChangeChangeValue(final FileChooser self, final Boolean value) {
|
||||||
|
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-shooser:list-files") instanceof final ListFileSystem tmp) {
|
||||||
|
tmp.setPropertyShowHidden(value);
|
||||||
|
}
|
||||||
|
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-shooser:list-folder") instanceof final ListFileSystem tmp) {
|
||||||
|
tmp.setPropertyShowHidden(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackHomePressed(final FileChooser self) {
|
||||||
|
final String tmpUserFolder = System.getProperty("user.home");
|
||||||
|
Log.debug("new PATH: '" + tmpUserFolder + "'");
|
||||||
|
|
||||||
|
self.propertyPath = tmpUserFolder;
|
||||||
|
self.propertyFile = "";
|
||||||
|
self.updateCurrentFolder();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackListFileSelectChange(final FileChooser self, final String value) {
|
||||||
|
self.setPropertyFile(value);
|
||||||
|
/*
|
||||||
|
String tmpFileCompleatName = this.folder;
|
||||||
|
tmpFileCompleatName += this.file;
|
||||||
|
// TODO : generateEventId(_msg.getMessage(), tmpFileCompleatName);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackListFileValidate(final FileChooser self, final String value) {
|
||||||
|
// select the file == > generate a validate
|
||||||
|
self.setPropertyFile(value);
|
||||||
|
Log.verbose(" generate a fiel opening : '" + self.propertyFile + "'");
|
||||||
|
self.signalValidate.emit(value);
|
||||||
|
self.autoDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackListFolderSelectChange(final FileChooser self, final String value) {
|
||||||
|
// == > this is an internal event ...
|
||||||
|
Log.debug(" old PATH: '" + self.propertyPath + "' ==> '" + value + "'");
|
||||||
|
self.propertyPath = value;
|
||||||
|
Log.debug("new PATH: '" + self.propertyPath + "'");
|
||||||
|
self.propertyFile = "";
|
||||||
|
self.updateCurrentFolder();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void onCallbackListValidate(final FileChooser self, final Boolean value) {
|
||||||
|
if (!value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (self.propertyFile.isEmpty()) {
|
||||||
|
Log.warning(" Validate : '" + self.propertyFile + "' ==> error No name ...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Log.debug(" generate a file opening : '" + self.propertyFile + "'");
|
||||||
|
self.signalValidate.emit(self.propertyFile);
|
||||||
|
self.autoDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EwolSignal(name = "cancel")
|
||||||
|
@EwolDescription(value = "Cancel button is pressed")
|
||||||
|
public SignalEmpty signalCancel; //!< abort the display of the pop-up or press cancel button
|
||||||
|
|
||||||
|
@EwolSignal(name = "validate")
|
||||||
|
@EwolDescription(value = "Validate button is pressed")
|
||||||
|
public Signal<String> signalValidate; //!< select file(s)
|
||||||
|
// properties
|
||||||
|
public String propertyPath = System.getProperty("user.home"); //!< Current path to explore
|
||||||
|
|
||||||
|
public String propertyFile = ""; //!< Selected file
|
||||||
|
public String propertyLabelTitle = "_T{FileChooser}"; //!< Label of the pop-up (can use translation)
|
||||||
|
|
||||||
|
public String propertyLabelValidate = "_T{Validate}"; //!< Label of validate button of the pop-up (can use translation)
|
||||||
|
public String propertyLabelCancel = "_T{Cancel}"; //!< Label of cancel/close button of the pop-up (can use translation)
|
||||||
|
|
||||||
|
public FileChooser() {
|
||||||
|
// Load file with replacing the "{ID}" with the local ID of the widget ==> obtain unique ID
|
||||||
|
loadFromFile(new Uri("DATA", "ewol-gui-file-chooser.xml", "ewol"));
|
||||||
|
// Basic replacement of labels
|
||||||
|
onChangePropertyLabelTitle();
|
||||||
|
onChangePropertyLabelValidate();
|
||||||
|
onChangePropertyLabelCancel();
|
||||||
|
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:show-hiden-file") instanceof final CheckBox tmp) {
|
||||||
|
tmp.signalValue.connectAuto(this, FileChooser::onCallbackHidenFileChangeChangeValue);
|
||||||
|
}
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:button-validate") instanceof final Button tmp) {
|
||||||
|
tmp.signalValue.connectAuto(this, FileChooser::onCallbackListValidate);
|
||||||
|
}
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:button-cancel") instanceof final Button tmp) {
|
||||||
|
tmp.signalValue.connectAuto(this, FileChooser::onCallbackButtonCancelPressed);
|
||||||
|
}
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:list-folder") instanceof final ListFileSystem tmp) {
|
||||||
|
tmp.signalFolderValidate.connectAuto(this, FileChooser::onCallbackListFolderSelectChange);
|
||||||
|
}
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:list-files") instanceof final ListFileSystem tmp) {
|
||||||
|
tmp.signalFileSelect.connectAuto(this, FileChooser::onCallbackListFileSelectChange);
|
||||||
|
tmp.signalFileValidate.connectAuto(this, FileChooser::onCallbackListFileValidate);
|
||||||
|
}
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-file") instanceof final Entry tmp) {
|
||||||
|
tmp.signalModify.connectAuto(this, FileChooser::onCallbackEntryFileChangeValue);
|
||||||
|
tmp.signalEnter.connectAuto(this, FileChooser::onCallbackEntryFileChangeValidate);
|
||||||
|
}
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-folder") instanceof final Entry tmp) {
|
||||||
|
tmp.signalModify.connectAuto(this, FileChooser::onCallbackEntryFolderChangeValue);
|
||||||
|
}
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:img-home") instanceof final ImageDisplay tmp) {
|
||||||
|
tmp.signalPressed.connectAuto(this, FileChooser::onCallbackHomePressed);
|
||||||
|
}
|
||||||
|
// set the default Folder properties:
|
||||||
|
updateCurrentFolder();
|
||||||
|
setPropertyCanFocus(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyFile() {
|
||||||
|
return this.propertyFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyLabelCancel() {
|
||||||
|
return this.propertyLabelCancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
// callback functions:
|
||||||
|
public String getPropertyLabelTitle() {
|
||||||
|
return this.propertyLabelTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyLabelValidate() {
|
||||||
|
return this.propertyLabelValidate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyPath() {
|
||||||
|
return this.propertyPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyFile() {
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-file") instanceof final ListFileSystem tmp) {
|
||||||
|
tmp.setPropertyFile(new File(this.propertyFile));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyLabelCancel() {
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:cancel-label") instanceof final Label tmp) {
|
||||||
|
tmp.setPropertyValue(this.propertyLabelCancel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyLabelTitle() {
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:title-label") instanceof final Label tmp) {
|
||||||
|
tmp.setPropertyValue(this.propertyLabelTitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyLabelValidate() {
|
||||||
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:validate-label") instanceof final Label tmp) {
|
||||||
|
tmp.setPropertyValue(this.propertyLabelValidate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyPath() {
|
||||||
|
this.propertyPath = this.propertyPath + "/";
|
||||||
|
updateCurrentFolder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onGetFocus() {
|
||||||
|
// transfert focus on a specific widget...
|
||||||
|
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-folder") instanceof final Entry tmp) {
|
||||||
|
tmp.keepFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "file")
|
||||||
|
public void setPropertyFile(final String propertyFile) {
|
||||||
|
if (this.propertyFile.equals(propertyFile)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyFile = propertyFile;
|
||||||
|
onChangePropertyFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "label-cancel")
|
||||||
|
@EwolDescription(value = "Label for cancel button")
|
||||||
|
public void setPropertyLabelCancel(final String propertyLabelCancel) {
|
||||||
|
if (this.propertyLabelCancel.equals(propertyLabelCancel)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyLabelCancel = propertyLabelCancel;
|
||||||
|
onChangePropertyLabelCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "title")
|
||||||
|
@EwolDescription(value = "Titile of the Pop-up")
|
||||||
|
public void setPropertyLabelTitle(final String propertyLabelTitle) {
|
||||||
|
if (this.propertyLabelTitle.equals(propertyLabelTitle)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyLabelTitle = propertyLabelTitle;
|
||||||
|
onChangePropertyLabelTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "label-validate")
|
||||||
|
@EwolDescription(value = "Label for validate button")
|
||||||
|
public void setPropertyLabelValidate(final String propertyLabelValidate) {
|
||||||
|
if (this.propertyLabelValidate.equals(propertyLabelValidate)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyLabelValidate = propertyLabelValidate;
|
||||||
|
onChangePropertyLabelValidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "path")
|
||||||
|
@EwolDescription(value = "Path of the File chooser")
|
||||||
|
public void setPropertyPath(final String propertyPath) {
|
||||||
|
if (this.propertyPath.equals(propertyPath)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyPath = propertyPath;
|
||||||
|
onChangePropertyPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateCurrentFolder() {
|
||||||
|
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:list-files") instanceof final ListFileSystem tmp) {
|
||||||
|
tmp.setPropertyPath(this.propertyPath);
|
||||||
|
}
|
||||||
|
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:list-folder") instanceof final ListFileSystem tmp) {
|
||||||
|
tmp.setPropertyPath(this.propertyPath);
|
||||||
|
}
|
||||||
|
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-folder") instanceof final Entry tmp) {
|
||||||
|
tmp.setPropertyValue(this.propertyPath);
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user