?
@ -102,6 +102,10 @@ public class CodeCompleter {
|
||||
switch (fileid) {
|
||||
case "functions":
|
||||
String[] args = line.split("\\|");
|
||||
// Prefix symat to Java commands
|
||||
if (lang.equals("java")) {
|
||||
args[0] = "symat." + args[0];
|
||||
}
|
||||
if (args.length == 2) {
|
||||
provider.addCompletion(new BasicCompletion(provider, args[0], args[1]));
|
||||
} else if (args.length == 3) {
|
||||
|
@ -92,9 +92,11 @@ public class Editor extends javax.swing.JInternalFrame {
|
||||
private boolean fileChanged = false;
|
||||
|
||||
private CompletionProvider jscomp = new CodeCompleter("js").getProvider();
|
||||
private CompletionProvider javacomp = new CodeCompleter("java").getProvider();
|
||||
private CompletionProvider pycomp = new CodeCompleter("py").getProvider();
|
||||
private AutoCompletion jsac = new AutoCompletion(jscomp);
|
||||
private AutoCompletion pyac = new AutoCompletion(pycomp);
|
||||
private AutoCompletion javaac = new AutoCompletion(javacomp);
|
||||
|
||||
/**
|
||||
* The JavaScript language.
|
||||
@ -169,6 +171,9 @@ public class Editor extends javax.swing.JInternalFrame {
|
||||
pythonOption.setSelected(true);
|
||||
codeBox.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_PYTHON);
|
||||
} else if (lang == JAVA) {
|
||||
javaac.install(codeBox);
|
||||
javascriptOption.setSelected(false);
|
||||
javaOption.setSelected(true);
|
||||
codeBox.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
|
||||
} else {
|
||||
jsac.install(codeBox);
|
||||
@ -928,12 +933,14 @@ public class Editor extends javax.swing.JInternalFrame {
|
||||
private void javascriptOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_javascriptOptionActionPerformed
|
||||
codeBox.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT);
|
||||
pyac.uninstall();
|
||||
javaac.uninstall();
|
||||
jsac.install(codeBox);
|
||||
}//GEN-LAST:event_javascriptOptionActionPerformed
|
||||
|
||||
private void pythonOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pythonOptionActionPerformed
|
||||
codeBox.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_PYTHON);
|
||||
jsac.uninstall();
|
||||
javaac.uninstall();
|
||||
pyac.install(codeBox);
|
||||
}//GEN-LAST:event_pythonOptionActionPerformed
|
||||
|
||||
@ -1010,8 +1017,9 @@ public class Editor extends javax.swing.JInternalFrame {
|
||||
|
||||
private void javaOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_javaOptionActionPerformed
|
||||
codeBox.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
|
||||
//pyac.uninstall();
|
||||
//jsac.install(codeBox);
|
||||
pyac.uninstall();
|
||||
jsac.uninstall();
|
||||
javaac.install(codeBox);
|
||||
}//GEN-LAST:event_javaOptionActionPerformed
|
||||
|
||||
private void createShared(String id) {
|
||||
@ -1057,14 +1065,15 @@ public class Editor extends javax.swing.JInternalFrame {
|
||||
text += line + "\n";
|
||||
}
|
||||
} catch (Exception e) {
|
||||
text = "Error: Could not open embedded sample file.";
|
||||
if (ext.startsWith("j")) {
|
||||
text = "/* " + text + " */";
|
||||
} else {
|
||||
text = "## " + text;
|
||||
outputBox.setText("Error: Could not open embedded sample file.");
|
||||
// if (ext.startsWith("j")) {
|
||||
// text = "/* " + text + " */";
|
||||
// } else {
|
||||
// text = "## " + text;
|
||||
// }
|
||||
}
|
||||
}
|
||||
openString(text, name + "." + ext, false);
|
||||
// Open it and remove the .txt ending on Java files
|
||||
openString(text, name + "." + ext.replace(".txt", ""), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -66,15 +66,16 @@
|
||||
<Component class="javax.swing.JList" name="topicList">
|
||||
<Properties>
|
||||
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
|
||||
<StringArray count="8">
|
||||
<StringArray count="9">
|
||||
<StringItem index="0" value="Welcome"/>
|
||||
<StringItem index="1" value="Basics"/>
|
||||
<StringItem index="2" value="Editor"/>
|
||||
<StringItem index="3" value="Pads"/>
|
||||
<StringItem index="4" value="Graphing"/>
|
||||
<StringItem index="5" value="Tasks"/>
|
||||
<StringItem index="6" value="Commands"/>
|
||||
<StringItem index="7" value="Licenses"/>
|
||||
<StringItem index="5" value="Notepad"/>
|
||||
<StringItem index="6" value="Tasks"/>
|
||||
<StringItem index="7" value="Commands"/>
|
||||
<StringItem index="8" value="Licenses"/>
|
||||
</StringArray>
|
||||
</Property>
|
||||
<Property name="selectionMode" type="int" value="0"/>
|
||||
|
@ -127,7 +127,11 @@ public class Help extends javax.swing.JInternalFrame {
|
||||
setBackground(Color.LIGHT_GRAY);
|
||||
styleloaded = 0;
|
||||
}
|
||||
try {
|
||||
loadTopic(topicList.getSelectedValue().toString().toLowerCase());
|
||||
} catch (Exception ex) {
|
||||
loadTopic("welcome");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -172,7 +176,7 @@ public class Help extends javax.swing.JInternalFrame {
|
||||
jSplitPane1.setResizeWeight(0.1);
|
||||
|
||||
topicList.setModel(new javax.swing.AbstractListModel() {
|
||||
String[] strings = { "Welcome", "Basics", "Editor", "Pads", "Graphing", "Tasks", "Commands", "Licenses" };
|
||||
String[] strings = { "Welcome", "Basics", "Editor", "Pads", "Graphing", "Notepad", "Tasks", "Commands", "Licenses" };
|
||||
public int getSize() { return strings.length; }
|
||||
public Object getElementAt(int i) { return strings[i]; }
|
||||
});
|
||||
|
@ -339,11 +339,10 @@ public class Main extends JRibbonFrame {
|
||||
tries++;
|
||||
}
|
||||
JRibbon ribbon = getRibbon();
|
||||
JRibbonBand coreband = new JRibbonBand("Core", null);
|
||||
JRibbonBand appsband = new JRibbonBand("Apps", null);
|
||||
JRibbonBand webband = new JRibbonBand("Community", null);
|
||||
JRibbonBand codeband = new JRibbonBand("Code", null);
|
||||
JRibbonBand toolsband = new JRibbonBand("Tools", null);
|
||||
JRibbonBand webband = new JRibbonBand("Web", null);
|
||||
JRibbonBand collabband = new JRibbonBand("Team", null);
|
||||
//JRibbonBand getpluginband = new JRibbonBand("Install", null);
|
||||
|
||||
try {
|
||||
loadPlugins();
|
||||
@ -385,12 +384,10 @@ public class Main extends JRibbonFrame {
|
||||
WebBrowser.WIKI_LOGO));
|
||||
}
|
||||
});
|
||||
forumbtn.addActionListener(new ActionListener() {
|
||||
browserbtn.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
loadFrame(new WebBrowser("Community Forum",
|
||||
"http://forum.symatapp.com/",
|
||||
WebBrowser.FORUM_LOGO));
|
||||
loadFrame(new WebBrowser());
|
||||
}
|
||||
});
|
||||
padsbtn.addActionListener(new ActionListener() {
|
||||
@ -416,31 +413,28 @@ public class Main extends JRibbonFrame {
|
||||
"Write quick notes on a virtual napkin."));
|
||||
wikibtn.setActionRichTooltip(new RichTooltip("SyMAT Wiki",
|
||||
"View and edit online documentation and tutorials."));
|
||||
forumbtn.setActionRichTooltip(new RichTooltip("Support Forum",
|
||||
"Discuss and share with the SyMAT community."));
|
||||
browserbtn.setActionRichTooltip(new RichTooltip("Web Browser",
|
||||
"Go online and browse the web."));
|
||||
padsbtn.setActionRichTooltip(new RichTooltip("Code Pads",
|
||||
"Collaborate over the Internet on projects."));
|
||||
tasksbtn.setActionRichTooltip(new RichTooltip("Task List",
|
||||
"Manage tasks and to-do lists for projects."));
|
||||
|
||||
coreband.addCommandButton(shellbtn, RibbonElementPriority.TOP);
|
||||
coreband.addCommandButton(editorbtn, RibbonElementPriority.TOP);
|
||||
codeband.addCommandButton(shellbtn, RibbonElementPriority.TOP);
|
||||
codeband.addCommandButton(editorbtn, RibbonElementPriority.TOP);
|
||||
|
||||
appsband.addCommandButton(graphbtn, RibbonElementPriority.MEDIUM);
|
||||
appsband.addCommandButton(notepadbtn, RibbonElementPriority.MEDIUM);
|
||||
toolsband.addCommandButton(graphbtn, RibbonElementPriority.MEDIUM);
|
||||
toolsband.addCommandButton(notepadbtn, RibbonElementPriority.MEDIUM);
|
||||
toolsband.addCommandButton(tasksbtn, RibbonElementPriority.MEDIUM);
|
||||
|
||||
webband.addCommandButton(wikibtn, RibbonElementPriority.LOW);
|
||||
webband.addCommandButton(forumbtn, RibbonElementPriority.LOW);
|
||||
webband.addCommandButton(padsbtn, RibbonElementPriority.TOP);
|
||||
webband.addCommandButton(browserbtn, RibbonElementPriority.MEDIUM);
|
||||
webband.addCommandButton(wikibtn, RibbonElementPriority.MEDIUM);
|
||||
|
||||
collabband.addCommandButton(padsbtn, RibbonElementPriority.MEDIUM);
|
||||
collabband.addCommandButton(tasksbtn, RibbonElementPriority.MEDIUM);
|
||||
|
||||
coreband.setResizePolicies((List) Arrays.asList(
|
||||
new CoreRibbonResizePolicies.None(coreband.getControlPanel()),
|
||||
new IconRibbonBandResizePolicy(coreband.getControlPanel())));
|
||||
appsband.setResizePolicies((List) Arrays.asList(
|
||||
new CoreRibbonResizePolicies.None(appsband.getControlPanel()),
|
||||
new IconRibbonBandResizePolicy(appsband.getControlPanel())));
|
||||
codeband.setResizePolicies((List) Arrays.asList(new CoreRibbonResizePolicies.None(codeband.getControlPanel()),
|
||||
new IconRibbonBandResizePolicy(codeband.getControlPanel())));
|
||||
toolsband.setResizePolicies((List) Arrays.asList(new CoreRibbonResizePolicies.None(toolsband.getControlPanel()),
|
||||
new IconRibbonBandResizePolicy(toolsband.getControlPanel())));
|
||||
webband.setResizePolicies((List) Arrays.asList(
|
||||
new CoreRibbonResizePolicies.None(webband.getControlPanel()),
|
||||
new IconRibbonBandResizePolicy(webband.getControlPanel())));
|
||||
@ -454,14 +448,14 @@ public class Main extends JRibbonFrame {
|
||||
// new CoreRibbonResizePolicies.None(appsband.getControlPanel()),
|
||||
// new IconRibbonBandResizePolicy(pluginband.getControlPanel())));
|
||||
|
||||
RibbonTask hometask = new RibbonTask("Home", coreband, appsband);
|
||||
RibbonTask webtask = new RibbonTask("Tools", webband, collabband);
|
||||
RibbonTask hometask = new RibbonTask("Apps", codeband, toolsband, webband);
|
||||
//RibbonTask webtask = new RibbonTask("Tools", webband, collabband);
|
||||
RibbonTask plugintask = new RibbonTask("Plugins", pluginband);
|
||||
|
||||
loadRibbonMenu(null);
|
||||
|
||||
ribbon.addTask(hometask);
|
||||
ribbon.addTask(webtask);
|
||||
//ribbon.addTask(webtask);
|
||||
ribbon.addTask(plugintask);
|
||||
}
|
||||
|
||||
@ -559,7 +553,7 @@ public class Main extends JRibbonFrame {
|
||||
new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
loadFrame(new Editor());
|
||||
loadFrame(new Editor(Editor.JAVASCRIPT));
|
||||
}
|
||||
},
|
||||
JCommandButton.CommandButtonKind.ACTION_ONLY);
|
||||
@ -570,7 +564,18 @@ public class Main extends JRibbonFrame {
|
||||
new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
loadFrame(new Editor(true));
|
||||
loadFrame(new Editor(Editor.PYTHON));
|
||||
}
|
||||
},
|
||||
JCommandButton.CommandButtonKind.ACTION_ONLY);
|
||||
RibbonApplicationMenuEntrySecondary newjavabtn
|
||||
= new RibbonApplicationMenuEntrySecondary(
|
||||
getTinyRibbonIcon("jaicon"),
|
||||
"Java",
|
||||
new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
loadFrame(new Editor(Editor.JAVA));
|
||||
}
|
||||
},
|
||||
JCommandButton.CommandButtonKind.ACTION_ONLY);
|
||||
@ -637,7 +642,7 @@ public class Main extends JRibbonFrame {
|
||||
} else {
|
||||
openbtn.addSecondaryMenuGroup("Recent Files", recent);
|
||||
}
|
||||
newbtn.addSecondaryMenuGroup("Code File", newjsbtn, newpybtn);
|
||||
newbtn.addSecondaryMenuGroup("Code File", newjsbtn, newpybtn, newjavabtn);
|
||||
newbtn.addSecondaryMenuGroup("Other", newtaskbtn);
|
||||
|
||||
RibbonApplicationMenuEntryFooter displaybtn
|
||||
@ -1150,8 +1155,8 @@ public class Main extends JRibbonFrame {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static JCommandButton forumbtn
|
||||
= new JCommandButton("Forum", getRibbonIcon("forum"));
|
||||
public static JCommandButton browserbtn
|
||||
= new JCommandButton("Browser", getRibbonIcon("browser"));
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -85,7 +85,7 @@
|
||||
<Dimension value="[300, 300]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[480, 400]"/>
|
||||
<Dimension value="[550, 391]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
@ -107,16 +107,19 @@
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-112,0,0,1,-32"/>
|
||||
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-121,0,0,2,38"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JSplitPane" name="jSplitPane1">
|
||||
<Properties>
|
||||
<Property name="dividerLocation" type="int" value="260"/>
|
||||
<Property name="dividerLocation" type="int" value="200"/>
|
||||
<Property name="orientation" type="int" value="0"/>
|
||||
<Property name="resizeWeight" type="double" value="0.7"/>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[550, 375]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
@ -143,15 +146,42 @@
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="jPanel1">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||
<JSplitPaneConstraints position="bottom"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="437" max="32767" attributes="0"/>
|
||||
<Component id="clearBtn" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="jScrollPane1" alignment="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="jLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="clearBtn" alignment="0" min="-2" pref="18" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane1" pref="100" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||
<JSplitPaneConstraints position="right"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
@ -164,6 +194,22 @@
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JButton" name="clearBtn">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Clear"/>
|
||||
<Property name="toolTipText" type="java.lang.String" value=""/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearBtnActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="jLabel1">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Output:"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JToolBar" name="statusBar">
|
||||
|
@ -219,8 +219,11 @@ public class PadEditor extends javax.swing.JInternalFrame implements RunScriptLi
|
||||
|
||||
jSplitPane1 = new javax.swing.JSplitPane();
|
||||
browserBox = new javax.swing.JPanel();
|
||||
jPanel1 = new javax.swing.JPanel();
|
||||
jScrollPane1 = new javax.swing.JScrollPane();
|
||||
outputBox = new javax.swing.JTextArea();
|
||||
clearBtn = new javax.swing.JButton();
|
||||
jLabel1 = new javax.swing.JLabel();
|
||||
statusBar = new javax.swing.JToolBar();
|
||||
statusLbl = new javax.swing.JLabel();
|
||||
jMenuBar1 = new javax.swing.JMenuBar();
|
||||
@ -239,7 +242,7 @@ public class PadEditor extends javax.swing.JInternalFrame implements RunScriptLi
|
||||
setTitle("Pad Editor");
|
||||
setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/editor.png"))); // NOI18N
|
||||
setMinimumSize(new java.awt.Dimension(300, 300));
|
||||
setPreferredSize(new java.awt.Dimension(480, 400));
|
||||
setPreferredSize(new java.awt.Dimension(550, 391));
|
||||
addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
|
||||
public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
|
||||
}
|
||||
@ -266,9 +269,10 @@ public class PadEditor extends javax.swing.JInternalFrame implements RunScriptLi
|
||||
}
|
||||
});
|
||||
|
||||
jSplitPane1.setDividerLocation(260);
|
||||
jSplitPane1.setDividerLocation(200);
|
||||
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
|
||||
jSplitPane1.setResizeWeight(0.7);
|
||||
jSplitPane1.setPreferredSize(new java.awt.Dimension(550, 375));
|
||||
|
||||
browserBox.setMinimumSize(new java.awt.Dimension(100, 25));
|
||||
browserBox.addComponentListener(new java.awt.event.ComponentAdapter() {
|
||||
@ -284,7 +288,37 @@ public class PadEditor extends javax.swing.JInternalFrame implements RunScriptLi
|
||||
outputBox.setTabSize(4);
|
||||
jScrollPane1.setViewportView(outputBox);
|
||||
|
||||
jSplitPane1.setRightComponent(jScrollPane1);
|
||||
clearBtn.setText("Clear");
|
||||
clearBtn.setToolTipText("");
|
||||
clearBtn.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
clearBtnActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
jLabel1.setText("Output:");
|
||||
|
||||
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
||||
jPanel1.setLayout(jPanel1Layout);
|
||||
jPanel1Layout.setHorizontalGroup(
|
||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||
.addComponent(jLabel1)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 437, Short.MAX_VALUE)
|
||||
.addComponent(clearBtn))
|
||||
.addComponent(jScrollPane1)
|
||||
);
|
||||
jPanel1Layout.setVerticalGroup(
|
||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jLabel1)
|
||||
.addComponent(clearBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(0, 0, 0)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
jSplitPane1.setBottomComponent(jPanel1);
|
||||
|
||||
getContentPane().add(jSplitPane1, java.awt.BorderLayout.CENTER);
|
||||
|
||||
@ -426,21 +460,31 @@ public class PadEditor extends javax.swing.JInternalFrame implements RunScriptLi
|
||||
}
|
||||
|
||||
private void javascriptOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_javascriptOptionActionPerformed
|
||||
|
||||
pythonOption.setSelected(false);
|
||||
javaOption.setSelected(false);
|
||||
javascriptOption.setSelected(true);
|
||||
}//GEN-LAST:event_javascriptOptionActionPerformed
|
||||
|
||||
private void pythonOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pythonOptionActionPerformed
|
||||
|
||||
pythonOption.setSelected(true);
|
||||
javaOption.setSelected(false);
|
||||
javascriptOption.setSelected(false);
|
||||
}//GEN-LAST:event_pythonOptionActionPerformed
|
||||
|
||||
private void javaOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_javaOptionActionPerformed
|
||||
|
||||
pythonOption.setSelected(false);
|
||||
javaOption.setSelected(true);
|
||||
javascriptOption.setSelected(false);
|
||||
}//GEN-LAST:event_javaOptionActionPerformed
|
||||
|
||||
private void browserBoxComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_browserBoxComponentResized
|
||||
resizeAll();
|
||||
}//GEN-LAST:event_browserBoxComponentResized
|
||||
|
||||
private void clearBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearBtnActionPerformed
|
||||
outputBox.setText("");
|
||||
}//GEN-LAST:event_clearBtnActionPerformed
|
||||
|
||||
private void resizeAll() {
|
||||
Platform.runLater(new Runnable() {
|
||||
@Override
|
||||
@ -454,8 +498,11 @@ public class PadEditor extends javax.swing.JInternalFrame implements RunScriptLi
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JPanel browserBox;
|
||||
private javax.swing.JButton clearBtn;
|
||||
private javax.swing.JMenu codeLangMenu;
|
||||
private javax.swing.JLabel jLabel1;
|
||||
private javax.swing.JMenuBar jMenuBar1;
|
||||
private javax.swing.JPanel jPanel1;
|
||||
private javax.swing.JScrollPane jScrollPane1;
|
||||
private javax.swing.JSplitPane jSplitPane1;
|
||||
private javax.swing.JRadioButtonMenuItem javaOption;
|
||||
|
@ -95,6 +95,7 @@ public class Update extends javax.swing.JInternalFrame {
|
||||
@Override
|
||||
public void run() {
|
||||
changelogBox.setText(html);
|
||||
changelogBox.setCaretPosition(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -61,11 +61,14 @@
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="Main.ubuntuRegular.deriveFont(16.0f)" type="code"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="<"/>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/net/apocalypselabs/symat/icons/arrow-left.png"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" value="Go back a page"/>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[30, 21]"/>
|
||||
<Dimension value="[50, 50]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[30, 21]"/>
|
||||
@ -93,19 +96,36 @@
|
||||
<AuxValue name="JavaCodeGenerator_ListenersCodePost" type="java.lang.String" value="navBar.add(urlBox, java.awt.BorderLayout.CENTER);
/*"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Container class="javax.swing.JToolBar" name="buttonBar">
|
||||
<Properties>
|
||||
<Property name="floatable" type="boolean" value="false"/>
|
||||
<Property name="rollover" type="boolean" value="true"/>
|
||||
<Property name="borderPainted" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_AddingCodePost" type="java.lang.String" value="*/"/>
|
||||
<AuxValue name="JavaCodeGenerator_InitCodePost" type="java.lang.String" value="navBar.add(buttonBar, BorderLayout.EAST);"/>
|
||||
<AuxValue name="JavaCodeGenerator_LayoutCodePost" type="java.lang.String" value="/*"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JButton" name="goBtn">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Go"/>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/net/apocalypselabs/symat/icons/goarrow.png"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" value="Navigate"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[30, 21]"/>
|
||||
<Dimension value="[50, 50]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[30, 21]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[30, 21]"/>
|
||||
<Dimension value="[30, 30]"/>
|
||||
</Property>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
@ -114,10 +134,31 @@
|
||||
</Events>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_AddingCodePost" type="java.lang.String" value="*/"/>
|
||||
<AuxValue name="JavaCodeGenerator_InitCodePost" type="java.lang.String" value="navBar.add(goBtn, java.awt.BorderLayout.EAST);"/>
|
||||
<AuxValue name="JavaCodeGenerator_InitCodePost" type="java.lang.String" value="buttonBar.add(goBtn);"/>
|
||||
<AuxValue name="JavaCodeGenerator_ListenersCodePost" type="java.lang.String" value="/*"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToolBar$Separator" name="sepBar">
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="homeBtn">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/net/apocalypselabs/symat/icons/home.png"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" value="Go to homepage"/>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[50, 50]"/>
|
||||
</Property>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="homeBtnActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="browserBox">
|
||||
|
@ -56,6 +56,7 @@
|
||||
package net.apocalypselabs.symat;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
@ -76,6 +77,8 @@ import javafx.scene.web.WebEvent;
|
||||
import javafx.scene.web.WebView;
|
||||
import javafx.util.Callback;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JInternalFrame;
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
@ -190,27 +193,6 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
loadURL("http://wiki.symatapp.com/");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String homepage() {
|
||||
try {
|
||||
String text = "";
|
||||
BufferedReader reader = new BufferedReader(
|
||||
new InputStreamReader(
|
||||
WebBrowser.class
|
||||
.getResourceAsStream("resources/homepage.html")));
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
text += line;
|
||||
}
|
||||
return text;
|
||||
} catch (IOException ex) {
|
||||
return "Error: " + ex.getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param title
|
||||
@ -232,15 +214,21 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
this(title, url);
|
||||
switch (icon) {
|
||||
case WIKI_LOGO:
|
||||
homeBtn.setVisible(false);
|
||||
sepBar.setVisible(false);
|
||||
setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/wiki.png")));
|
||||
break;
|
||||
case FORUM_LOGO:
|
||||
homeBtn.setVisible(false);
|
||||
sepBar.setVisible(false);
|
||||
setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/forum.png")));
|
||||
break;
|
||||
case PAD_LOGO:
|
||||
navBar.setVisible(false);
|
||||
goBtn.setEnabled(false);
|
||||
backBtn.setEnabled(false);
|
||||
homeBtn.setVisible(false);
|
||||
sepBar.setVisible(false);
|
||||
setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/editor.png")));
|
||||
break;
|
||||
default:
|
||||
@ -274,6 +262,29 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
* @param url
|
||||
*/
|
||||
public void loadURL(final String url) {
|
||||
if (url.startsWith("about:")) {
|
||||
final String action = url.replace("about:", "");
|
||||
Platform.runLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
switch (action) {
|
||||
case "home":
|
||||
webEngine.loadContent(homepage());
|
||||
break;
|
||||
case "blank":
|
||||
webEngine.loadContent("");
|
||||
break;
|
||||
case "new":
|
||||
Main.loadFrame(new WebBrowser());
|
||||
break;
|
||||
default:
|
||||
webEngine.loadContent(errorpage("Invalid URL", "That isn't a valid address."));
|
||||
}
|
||||
resizeAll();
|
||||
}
|
||||
});
|
||||
urlBox.setText(url);
|
||||
} else {
|
||||
Platform.runLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@ -283,6 +294,59 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
});
|
||||
urlBox.setText(url);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the homepage/startpage HTML.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String homepage() {
|
||||
try {
|
||||
String text = "";
|
||||
BufferedReader reader = new BufferedReader(
|
||||
new InputStreamReader(
|
||||
WebBrowser.class
|
||||
.getResourceAsStream("resources/homepage.html")));
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
text += line;
|
||||
}
|
||||
return text;
|
||||
} catch (IOException ex) {
|
||||
return errorpage("Error: " + ex.getMessage(), ex.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a webpage suitable for showing error messages.
|
||||
*
|
||||
* @param error Short error message
|
||||
* @param details Error information
|
||||
* @return HTML page content
|
||||
*/
|
||||
public String errorpage(String error, String details) {
|
||||
try {
|
||||
String text = "";
|
||||
BufferedReader reader = new BufferedReader(
|
||||
new InputStreamReader(
|
||||
WebBrowser.class
|
||||
.getResourceAsStream("resources/errorpage.html")));
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
text += line;
|
||||
}
|
||||
text = text.replaceAll("<<<ERROR>>>", error);
|
||||
text = text.replaceAll("<<<DETAILS>>>", details);
|
||||
return text;
|
||||
} catch (IOException ex) {
|
||||
return "Oh, no! Something bad happened:<br />"
|
||||
+ error
|
||||
+ "<br />Also, an error occured "
|
||||
+ "while displaying the error page: "
|
||||
+ ex.getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
@ -318,7 +382,10 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
navBar = new javax.swing.JToolBar();
|
||||
backBtn = new javax.swing.JButton();
|
||||
urlBox = new javax.swing.JTextField();
|
||||
buttonBar = new javax.swing.JToolBar();
|
||||
goBtn = new javax.swing.JButton();
|
||||
sepBar = new javax.swing.JToolBar.Separator();
|
||||
homeBtn = new javax.swing.JButton();
|
||||
browserBox = new javax.swing.JPanel();
|
||||
|
||||
setClosable(true);
|
||||
@ -360,10 +427,11 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
navBar.setLayout(new java.awt.BorderLayout());
|
||||
|
||||
backBtn.setFont(Main.ubuntuRegular.deriveFont(16.0f));
|
||||
backBtn.setText("<");
|
||||
backBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/arrow-left.png"))); // NOI18N
|
||||
backBtn.setToolTipText("Go back a page");
|
||||
backBtn.setFocusable(false);
|
||||
backBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
||||
backBtn.setMaximumSize(new java.awt.Dimension(30, 21));
|
||||
backBtn.setMaximumSize(new java.awt.Dimension(50, 50));
|
||||
backBtn.setMinimumSize(new java.awt.Dimension(30, 21));
|
||||
backBtn.setPreferredSize(new java.awt.Dimension(30, 21));
|
||||
backBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
||||
@ -387,21 +455,45 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
navBar.add(urlBox);
|
||||
*/
|
||||
|
||||
goBtn.setText("Go");
|
||||
goBtn.setFocusable(false);
|
||||
buttonBar.setFloatable(false);
|
||||
buttonBar.setRollover(true);
|
||||
buttonBar.setBorderPainted(false);
|
||||
navBar.add(buttonBar, BorderLayout.EAST);
|
||||
|
||||
goBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/goarrow.png"))); // NOI18N
|
||||
goBtn.setToolTipText("Navigate");
|
||||
goBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
||||
goBtn.setMaximumSize(new java.awt.Dimension(30, 21));
|
||||
goBtn.setMaximumSize(new java.awt.Dimension(50, 50));
|
||||
goBtn.setMinimumSize(new java.awt.Dimension(30, 21));
|
||||
goBtn.setPreferredSize(new java.awt.Dimension(30, 21));
|
||||
goBtn.setPreferredSize(new java.awt.Dimension(30, 30));
|
||||
goBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
||||
navBar.add(goBtn, java.awt.BorderLayout.EAST);
|
||||
buttonBar.add(goBtn);
|
||||
goBtn.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
goBtnActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
/*
|
||||
navBar.add(goBtn);
|
||||
buttonBar.add(goBtn);
|
||||
*/
|
||||
buttonBar.add(sepBar);
|
||||
|
||||
homeBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/home.png"))); // NOI18N
|
||||
homeBtn.setToolTipText("Go to homepage");
|
||||
homeBtn.setFocusable(false);
|
||||
homeBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
||||
homeBtn.setMaximumSize(new java.awt.Dimension(50, 50));
|
||||
homeBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
||||
homeBtn.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
homeBtnActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
buttonBar.add(homeBtn);
|
||||
|
||||
/*
|
||||
|
||||
navBar.add(buttonBar);
|
||||
*/
|
||||
|
||||
getContentPane().add(navBar, java.awt.BorderLayout.PAGE_START);
|
||||
@ -437,7 +529,7 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
if (urlBox.getText().equals("about:home")) {
|
||||
loadString(homepage());
|
||||
} else {
|
||||
if (!urlBox.getText().startsWith("http")) {
|
||||
if (!urlBox.getText().startsWith("http") && !urlBox.getText().startsWith("about:")) {
|
||||
urlBox.setText("http://" + urlBox.getText());
|
||||
}
|
||||
loadURL(urlBox.getText());
|
||||
@ -456,6 +548,10 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
});
|
||||
}//GEN-LAST:event_backBtnActionPerformed
|
||||
|
||||
private void homeBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_homeBtnActionPerformed
|
||||
loadURL("about:home");
|
||||
}//GEN-LAST:event_homeBtnActionPerformed
|
||||
|
||||
private void resizeAll() {
|
||||
Platform.runLater(new Runnable() {
|
||||
@Override
|
||||
@ -467,11 +563,32 @@ public class WebBrowser extends javax.swing.JInternalFrame {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a component to the toolbar.
|
||||
* @param btn The JComponent to add.
|
||||
*/
|
||||
public void addButton(JComponent btn) {
|
||||
buttonBar.add(btn);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a button to the toolbar.
|
||||
* @param btn The JButton to add.
|
||||
* @param action An ActionListener to handle actions.
|
||||
*/
|
||||
public void addButton(JButton btn, ActionListener action) {
|
||||
buttonBar.add(btn);
|
||||
btn.addActionListener(action);
|
||||
}
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton backBtn;
|
||||
private javax.swing.JPanel browserBox;
|
||||
public javax.swing.JToolBar buttonBar;
|
||||
private javax.swing.JButton goBtn;
|
||||
private javax.swing.JButton homeBtn;
|
||||
private javax.swing.JToolBar navBar;
|
||||
private javax.swing.JToolBar.Separator sepBar;
|
||||
private javax.swing.JTextField urlBox;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
||||
|
@ -1,3 +1,3 @@
|
||||
String formula = ask("Enter formula:");
|
||||
plot(formula);
|
||||
plotname("Cool graph!");
|
||||
String formula = symat.ask("Enter formula:");
|
||||
symat.plot(formula);
|
||||
symat.plotname("Cool graph!");
|
@ -1,6 +1,9 @@
|
||||
public class HelloWorld {
|
||||
public static void main(String[] args) {
|
||||
print("Hello world");
|
||||
String message = "Hello World!";
|
||||
int x = 5;
|
||||
print(message);
|
||||
symat.notify(message + " X is " + x + ".");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,162 +1,6 @@
|
||||
void notify(String msg) {
|
||||
SyMAT_Functions.notify(msg);
|
||||
}
|
||||
Object ask(String msg) {
|
||||
return SyMAT_Functions.ask(msg);
|
||||
}
|
||||
Object factorial(int n) {
|
||||
return SyMAT_Functions.factorial(n);
|
||||
}
|
||||
Object diff(String fun,String var) {
|
||||
return SyMAT_Functions.diff(fun,var);
|
||||
}
|
||||
Object integrate(String fun,String var) {
|
||||
return SyMAT_Functions.integrate(fun,var);
|
||||
}
|
||||
Object rad(double num) {
|
||||
return SyMAT_Functions.rad(num);
|
||||
}
|
||||
Object deg(double num) {
|
||||
return SyMAT_Functions.deg(num);
|
||||
}
|
||||
Object subs(String fun,String var) {
|
||||
return SyMAT_Functions.subs(fun,var);
|
||||
}
|
||||
void plot(String fun) {
|
||||
SyMAT_Functions.plot(fun);
|
||||
}
|
||||
void plot() {
|
||||
SyMAT_Functions.plot();
|
||||
}
|
||||
void plotname(String fun) {
|
||||
SyMAT_Functions.plotname(fun);
|
||||
}
|
||||
Object plotname() {
|
||||
return SyMAT_Functions.plotname();
|
||||
}
|
||||
void xlim(int min, int max) {
|
||||
SyMAT_Functions.xlim(min,max);
|
||||
}
|
||||
void plotclr() {
|
||||
SyMAT_Functions.plotclr();
|
||||
}
|
||||
void drawdot(int x, int y) {
|
||||
SyMAT_Functions.drawdot(x, y);
|
||||
}
|
||||
Object simplify(String expr) {
|
||||
return SyMAT_Functions.simplify(expr);
|
||||
}
|
||||
Object vpa(String expr) {
|
||||
return SyMAT_Functions.vpa(expr);
|
||||
}
|
||||
Object readfile(String path) {
|
||||
return SyMAT_Functions.readfile(path);
|
||||
}
|
||||
void savefile(String data,String path) {
|
||||
SyMAT_Functions.savefile(data,path);
|
||||
}
|
||||
Object mtimes(double[][] a, double[][] b) {
|
||||
return SyMAT_Functions.mtimes(a,b);
|
||||
}
|
||||
Object mpower(double[][] a, int b) {
|
||||
return SyMAT_Functions.mpower(a,b);
|
||||
}
|
||||
Object add(double a...) {
|
||||
return SyMAT_Functions.add(a);
|
||||
}
|
||||
Object subtract(double a...) {
|
||||
return SyMAT_Functions.subtract(a);
|
||||
}
|
||||
Object times(double a...) {
|
||||
return SyMAT_Functions.times(a);
|
||||
}
|
||||
Object divide(double a...) {
|
||||
return SyMAT_Functions.divide(a);
|
||||
}
|
||||
Object mod(double a...) {
|
||||
return SyMAT_Functions.mod(a);
|
||||
}
|
||||
Object rand(int min, int max) {
|
||||
return SyMAT_Functions.rand(min,max);
|
||||
}
|
||||
Object rand(int min) {
|
||||
return SyMAT_Functions.rand(min,1);
|
||||
}
|
||||
Object rand() {
|
||||
return SyMAT_Functions.rand(0,1);
|
||||
}
|
||||
Object randb() {
|
||||
return SyMAT_Functions.randb();
|
||||
}
|
||||
void sleep(int x) {
|
||||
SyMAT_Functions.sleep(x);
|
||||
}
|
||||
void pause(int x) {
|
||||
SyMAT_Functions.pause(x);
|
||||
}
|
||||
Object perms(double a...) {
|
||||
return SyMAT_Functions.perms(a);
|
||||
}
|
||||
Object md5sum(String a) {
|
||||
return SyMAT_Functions.md5sum(a);
|
||||
}
|
||||
Object save(String a, String b) {
|
||||
return SyMAT_Functions.save(a,b);
|
||||
}
|
||||
Object load(String a) {
|
||||
return SyMAT_Functions.load(a);
|
||||
}
|
||||
Object powermod(String a,String b,String m) {
|
||||
return SyMAT_Functions.powermod(a,b,m);
|
||||
}
|
||||
Object powermod(double a,double b,double m) {
|
||||
return SyMAT_Functions.powermod(a,b,m);
|
||||
}
|
||||
Object gcd(long a,long b) {
|
||||
return SyMAT_Functions.gcd(a,b);
|
||||
}
|
||||
Object solve(String a, String b, int c) {
|
||||
return SyMAT_Functions.solve(a,b,c);
|
||||
}
|
||||
Object solve(String a) {
|
||||
return SyMAT_Functions.solve(a,"x",0);
|
||||
}
|
||||
Object printa(Object a) {
|
||||
return SyMAT_Functions.printa(a);
|
||||
}
|
||||
Object sec(double a) {
|
||||
return SyMAT_Functions.sec(a);
|
||||
}
|
||||
Object csc(double a) {
|
||||
return SyMAT_Functions.csc(a);
|
||||
}
|
||||
Object cot(double a) {
|
||||
return SyMAT_Functions.cot(a);
|
||||
}
|
||||
Object asec(double a) {
|
||||
return SyMAT_Functions.asec(a);
|
||||
}
|
||||
Object acsc(double a) {
|
||||
return SyMAT_Functions.acsc(a);
|
||||
}
|
||||
Object acot(double a) {
|
||||
return SyMAT_Functions.acot(a);
|
||||
}
|
||||
Object sech(double a) {
|
||||
return SyMAT_Functions.sech(a);
|
||||
}
|
||||
Object csch(double a) {
|
||||
return SyMAT_Functions.csch(a);
|
||||
}
|
||||
Object coth(double a) {
|
||||
return SyMAT_Functions.coth(a);
|
||||
}
|
||||
Object filedialog() {
|
||||
return SyMAT_Functions.filedialog();
|
||||
}
|
||||
Object textbox() {
|
||||
return SyMAT_Functions.textbox();
|
||||
}
|
||||
Object browser() {
|
||||
return SyMAT_Functions.browser();
|
||||
}
|
||||
import net.apocalypselabs.symat.Functions;
|
||||
Functions symat = new Functions();
|
||||
public static final double E = java.lang.Math.E;
|
||||
public static final double PI = java.lang.Math.PI;
|
||||
public static final double SQRT1_2 = java.lang.Math.sqrt(0.5);
|
||||
public static final double SQRT2 = java.lang.Math.sqrt(2);
|
@ -8,6 +8,7 @@
|
||||
<br>Try typing commands, like "2*2" or "sin(.5)".
|
||||
<br>You can make variables too, try "x=.5" then "sin(x)".
|
||||
<br><br>SyMAT keeps track of the last few commands you enter in a shell.
|
||||
To run one again, use the up and down keys to navigate the history.</p>
|
||||
To run one again, use the up and down keys to navigate the history.
|
||||
<br><br>To see a list of special SyMAT commands, press Ctrl-Space while editing code.</p>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -55,7 +55,7 @@
|
||||
If any part of this license is deemed unenforcable, the remainder
|
||||
of the license remains in full effect.</p>
|
||||
<h2>This application also uses libraries from third-parties.</h2>
|
||||
<h3>tl;dr: Apache License, Modified BSD, GNU LGPL, Python Software License, CDDL V1.1, Mozilla Public License, Ubuntu Font License</h3>
|
||||
<h3>tl;dr: Apache License, Modified BSD, GNU LGPL, Python Software License, CDDL V1.1, Mozilla Public License, SIL Open Font License, Ubuntu Font License</h3>
|
||||
<p><b>Symja (parser), log4j, Java-Prettify, json-simple, java-etherpad-lite:</b></p>
|
||||
<p>Licensed under the Apache License, Version 2.0 (the "License");<br>
|
||||
you may not use this file except in compliance with the License.<br>
|
||||
@ -774,6 +774,103 @@ The code released under the CDDL shall be governed by the laws of the State of C
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
|
||||
</p><br>
|
||||
<br>
|
||||
<p><b>Font Awesome</b></p>
|
||||
<pre>Copyright (c) 2015, Dave Gandy (http://fontawesome.io),
|
||||
with Reserved Font Name Font Awesome.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
</pre>
|
||||
<br>
|
||||
<p><b>iTextPDF, Symja (core), BeanShell:</b></p>
|
||||
<p> GNU LESSER GENERAL PUBLIC LICENSE<br>
|
||||
Version 3, 29 June 2007<br>
|
||||
|
11
src/net/apocalypselabs/symat/help/notepad.html
Normal file
@ -0,0 +1,11 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Notepad</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Notepad</h1>
|
||||
<p>
|
||||
The Notepad is a window that automatically remembers what you type. Save reminders, code snippets, and more.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
@ -10,7 +10,7 @@
|
||||
servers. Share the address SyMAT gives you, and other people can
|
||||
access the script online.
|
||||
<br>To access a script, open Pads from the Tools tab.
|
||||
You can add, share, edit, and download pads from this window.
|
||||
You can add, share, edit, run, and download pads from this window.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
@ -5,7 +5,7 @@
|
||||
<body>
|
||||
<h1>Task Lists</h1>
|
||||
<p>
|
||||
Create a new Task List from the SyMAT Menu or the Tools tab.
|
||||
Create a new Task List from the SyMAT Menu or the Ribbon.
|
||||
<br>Items can be added from the Edit menu.
|
||||
To change the values of a task item,
|
||||
click the corresponding menu button.
|
||||
|
BIN
src/net/apocalypselabs/symat/icons/arrow-left.png
Normal file
After Width: | Height: | Size: 290 B |
BIN
src/net/apocalypselabs/symat/icons/arrow-right.png
Normal file
After Width: | Height: | Size: 285 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/adjust.png
Normal file
After Width: | Height: | Size: 294 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/adn.png
Normal file
After Width: | Height: | Size: 346 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/align-center.png
Normal file
After Width: | Height: | Size: 265 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/align-justify.png
Normal file
After Width: | Height: | Size: 246 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/align-left.png
Normal file
After Width: | Height: | Size: 260 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/align-right.png
Normal file
After Width: | Height: | Size: 266 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/ambulance.png
Normal file
After Width: | Height: | Size: 426 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/anchor.png
Normal file
After Width: | Height: | Size: 363 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/android.png
Normal file
After Width: | Height: | Size: 330 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/angellist.png
Normal file
After Width: | Height: | Size: 514 B |
After Width: | Height: | Size: 218 B |
After Width: | Height: | Size: 216 B |
After Width: | Height: | Size: 218 B |
After Width: | Height: | Size: 221 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/angle-down.png
Normal file
After Width: | Height: | Size: 189 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/angle-left.png
Normal file
After Width: | Height: | Size: 162 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/angle-right.png
Normal file
After Width: | Height: | Size: 163 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/angle-up.png
Normal file
After Width: | Height: | Size: 174 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/apple.png
Normal file
After Width: | Height: | Size: 317 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/archive.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/area-chart.png
Normal file
After Width: | Height: | Size: 301 B |
After Width: | Height: | Size: 366 B |
After Width: | Height: | Size: 335 B |
After Width: | Height: | Size: 364 B |
After Width: | Height: | Size: 357 B |
After Width: | Height: | Size: 366 B |
After Width: | Height: | Size: 373 B |
After Width: | Height: | Size: 340 B |
After Width: | Height: | Size: 351 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/arrow-down.png
Normal file
After Width: | Height: | Size: 267 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/arrow-left.png
Normal file
After Width: | Height: | Size: 290 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/arrow-right.png
Normal file
After Width: | Height: | Size: 285 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/arrow-up.png
Normal file
After Width: | Height: | Size: 246 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/arrows-alt.png
Normal file
After Width: | Height: | Size: 313 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/arrows-h.png
Normal file
After Width: | Height: | Size: 182 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/arrows-v.png
Normal file
After Width: | Height: | Size: 197 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/arrows.png
Normal file
After Width: | Height: | Size: 278 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/asterisk.png
Normal file
After Width: | Height: | Size: 292 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/at.png
Normal file
After Width: | Height: | Size: 476 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/backward.png
Normal file
After Width: | Height: | Size: 253 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/ban.png
Normal file
After Width: | Height: | Size: 395 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bar-chart.png
Normal file
After Width: | Height: | Size: 253 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/barcode.png
Normal file
After Width: | Height: | Size: 241 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bars.png
Normal file
After Width: | Height: | Size: 207 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bed.png
Normal file
After Width: | Height: | Size: 333 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/beer.png
Normal file
After Width: | Height: | Size: 295 B |
After Width: | Height: | Size: 417 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/behance.png
Normal file
After Width: | Height: | Size: 460 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bell-o.png
Normal file
After Width: | Height: | Size: 364 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bell-slash-o.png
Normal file
After Width: | Height: | Size: 479 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bell-slash.png
Normal file
After Width: | Height: | Size: 437 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bell.png
Normal file
After Width: | Height: | Size: 299 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bicycle.png
Normal file
After Width: | Height: | Size: 516 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/binoculars.png
Normal file
After Width: | Height: | Size: 321 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/birthday-cake.png
Normal file
After Width: | Height: | Size: 433 B |
After Width: | Height: | Size: 432 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bitbucket.png
Normal file
After Width: | Height: | Size: 435 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bold.png
Normal file
After Width: | Height: | Size: 421 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bolt.png
Normal file
After Width: | Height: | Size: 312 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bomb.png
Normal file
After Width: | Height: | Size: 368 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/book.png
Normal file
After Width: | Height: | Size: 408 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bookmark-o.png
Normal file
After Width: | Height: | Size: 277 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bookmark.png
Normal file
After Width: | Height: | Size: 235 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/briefcase.png
Normal file
After Width: | Height: | Size: 302 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/btc.png
Normal file
After Width: | Height: | Size: 385 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bug.png
Normal file
After Width: | Height: | Size: 351 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/building-o.png
Normal file
After Width: | Height: | Size: 372 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/building.png
Normal file
After Width: | Height: | Size: 431 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bullhorn.png
Normal file
After Width: | Height: | Size: 383 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bullseye.png
Normal file
After Width: | Height: | Size: 448 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/bus.png
Normal file
After Width: | Height: | Size: 437 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/buysellads.png
Normal file
After Width: | Height: | Size: 381 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/calculator.png
Normal file
After Width: | Height: | Size: 469 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/calendar-o.png
Normal file
After Width: | Height: | Size: 315 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/calendar.png
Normal file
After Width: | Height: | Size: 379 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/camera-retro.png
Normal file
After Width: | Height: | Size: 407 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/camera.png
Normal file
After Width: | Height: | Size: 426 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/car.png
Normal file
After Width: | Height: | Size: 412 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/caret-down.png
Normal file
After Width: | Height: | Size: 164 B |
BIN
src/net/apocalypselabs/symat/icons/fontawesome/caret-left.png
Normal file
After Width: | Height: | Size: 172 B |